Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何判断文本输入字段dom节点*没有*使用javascript进行选择?_Javascript_Dom Node - Fatal编程技术网

如何判断文本输入字段dom节点*没有*使用javascript进行选择?

如何判断文本输入字段dom节点*没有*使用javascript进行选择?,javascript,dom-node,Javascript,Dom Node,当我选中inputFieldDomNode.selectionStart时,它总是返回一些数字,即使它没有文本选择并且没有插入符号。那么,我如何判断它是否没有文本选择 至少在全局范围内,您可以使用 尽管有兼容性表,但我发现它在Chrome中工作,而且显然从那以后它也得到了支持。您可以检查是否使用以下内容选择了元素: document.getElementById("color-red").checked 它将返回一个布尔值 如果这是您想要的,请查看位于的示例。我想,但我不能100%确定,如果该

当我选中inputFieldDomNode.selectionStart时,它总是返回一些数字,即使它没有文本选择并且没有插入符号。那么,我如何判断它是否没有文本选择

至少在全局范围内,您可以使用


尽管有兼容性表,但我发现它在Chrome中工作,而且显然从那以后它也得到了支持。

您可以检查是否使用以下内容选择了元素:

document.getElementById("color-red").checked
它将返回一个布尔值


如果这是您想要的,请查看位于

的示例。我想,但我不能100%确定,如果该元素不是文档的活动元素,它就不能有文本选择。您可以使用document.activeElement对其进行测试:

示例:

好的,我想出来了:

exports.getSelectionRange = function (element) {
    if(element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
        var selection = window.getSelection()
        for(var n=0; n<selection.rangeCount; n++) {
            var range = selection.getRangeAt(0)
            if(range.startOffset === range.endOffset && range.startContainer.children[range.startOffset] === element /*|| range.startContainer === element || */) { // I don't think the input or textarea itself will ever be the startContainer
                return [element.selectionStart, element.selectionEnd]
            }
        }
        // else return undefined - the element doesn't have an active caret or active selection (it still may have an inactive selection)
    } else {
        // .. do something else unrelated to this question
    }
}
基本上,当您有一个活动文本输入时,它的父项是range.startContainer,因此您不仅要检查它是否是range.startContaine的子项,还要确保它是由range.startOffset确定的所选子项的正确子项。此外,您必须确保输入是唯一选中的内容,因为输入可能包含在较大的选择中


注意:我认为在实际输入节点是唯一选择的对象而不是其内容的情况下,这仍然可能失败。这是一种极为罕见的边缘情况,我不确定它是否可能通过用户输入实现,也不确定是否可能通过domapi实现

我可能不正确,但我相信他们指的是文本选择,而不是复选框选择。你可能是对的@Richard,我应该让OP先解释他的问题。这似乎只表明是否选择了一系列文本,而不是页面上某个地方有一个插入符号。A.这无助于我获取有关特定输入字段的任何信息,B.这无助于我判断插入符号是否在字段中。@BT这不只是焦点问题吗?如果未选择任何内容,则表示您很好。如果选择了某个对象,则只要该对象具有焦点,它就只能位于您的输入字段中。可以在没有焦点的情况下选择对象。在输入字段中?你确定吗?从我所看到的,选择不可避免地会产生焦点,移除焦点不可避免地会移除选择。嗯,我在通过API与选择和焦点交互时看到过。但如果不能通过用户输入,我也不会感到惊讶。这就是我在提出这个问题之前所做的尝试。但显然情况并非如此——如果我使用setSelectionRange而不关注它,至少在chrome上它仍然会失去焦点。所以它可能有假阴性。也许我可以组合测试并执行ifinputFieldDomNode==document.activeElement | | inputFieldDomNode.selectionStart!==inputFieldDomNode.selectionEnd?这样做有意义吗?不,这也不是在所有情况下都有效。测试一点,如果我用鼠标选择一个节点,使其成为活动元素,然后在控制台中使用setSelectionRange在不同的输入中选择一个范围,则activeElement仍然位于我用鼠标选择的第一个节点上。我可以点击滚动条,使页面回到与控制台相对的焦点,如果我向右按箭头,它将尊重选择中的插入符号,但如果我按tab,它会注意到处于焦点的节点。
if (inputFieldDomNode == document.activeElement) {
    // Do stuff with the selection
}
exports.getSelectionRange = function (element) {
    if(element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
        var selection = window.getSelection()
        for(var n=0; n<selection.rangeCount; n++) {
            var range = selection.getRangeAt(0)
            if(range.startOffset === range.endOffset && range.startContainer.children[range.startOffset] === element /*|| range.startContainer === element || */) { // I don't think the input or textarea itself will ever be the startContainer
                return [element.selectionStart, element.selectionEnd]
            }
        }
        // else return undefined - the element doesn't have an active caret or active selection (it still may have an inactive selection)
    } else {
        // .. do something else unrelated to this question
    }
}