当我检查inputFieldDomNode.selectionStart
时,它总是会返回一些数字,即使它没有文本选择且没有插入符号。那么如何判断 是否有文本选择呢?
答案 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
}
答案 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)。