如何判断文本输入字段dom节点是否*不具有javascript选择?

时间:2015-02-20 09:31:08

标签: javascript dom-node

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

4 个答案:

答案 0 :(得分:0)

至少全局窗口,您可以使用Selection.isCollapsed

window.getSelection().isCollapsed

尽管有兼容性表格,但我发现它在Chrome中运行,显然它自IE 9以来也得到了支持。

答案 1 :(得分:0)

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

document.getElementById("color-red").checked

将返回一个布尔值。

如果这是您想要的,请查看http://jsfiddle.net/o5t0ow9g/1/

上的示例

答案 2 :(得分:0)

我认为(但不是100%肯定)如果元素不是文档的活动元素,则它不能有文本选择。您可以使用document.activeElement

进行测试
if (inputFieldDomNode == document.activeElement) {
    // Do stuff with the selection
}

示例:http://jsfiddle.net/hpseuLj3/1/

答案 3 :(得分:0)

好的我明白了:

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决定。此外,您必须确保输入是选择的内容,因为输入可能包含在更大的选择中。

注意:我认为在实际输入节点是唯一选择且其内容的情况下,这可能仍会失败。这是一个非常罕见的边缘情况,我不确定它是否可能通过用户输入(可能通过dom API)。