0

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

4

4 回答 4

0

我认为(但不是 100% 确定)如果该元素不是文档的活动元素,则它不能有文本选择。您可以使用以下方法对其进行测试document.activeElement

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

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

于 2015-02-20T21:14:14.697 回答
0

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

window.getSelection().isCollapsed

尽管有兼容性表,但我发现它可以在 Chrome 中运行,而且显然它从IE 9开始也受到支持。

于 2015-02-20T09:42:53.550 回答
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 实现)。

于 2015-02-20T22:48:35.187 回答
0

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

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

这将返回一个布尔值。

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

于 2015-02-20T09:53:25.283 回答