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