究竟選擇什麼取決於選擇的方式和使用的瀏覽器。如果你在,是否所有的元素中的文本的選擇只是感興趣,四肢修長的Range
對象爲此提供了一個non-standard convenience method:
selRange.containsNodeText(el);
這裏是一個非瘦長等同。它沒有完全測試,但我認爲它會起作用。
function containsNodeText(range, node) {
var treeWalker = document.createTreeWalker(node,
NodeFilter.SHOW_TEXT,
{ acceptNode: function(node) { return NodeFilter.FILTER_ACCEPT; } },
false
);
var firstTextNode, lastTextNode, textNode;
while ((textNode = treeWalker.nextNode())) {
if (!firstTextNode) {
firstTextNode = textNode;
}
lastTextNode = textNode;
}
var nodeRange = range.cloneRange();
if (firstTextNode) {
nodeRange.setStart(firstTextNode, 0);
nodeRange.setEnd(lastTextNode, lastTextNode.length);
} else {
nodeRange.selectNodeContents(node);
}
return range.compareBoundaryPoints(Range.START_TO_START, nodeRange) < 1 &&
range.compareBoundaryPoints(Range.END_TO_END, nodeRange) > -1;
}
您可以閱讀頭腦。這正是我需要的。 containsNode在瀏覽器中的行爲不一致。如果選擇實際上超出了元素本身,Safari只會報告它包含該節點。謝謝!! – 2014-12-30 14:35:13
什麼是最簡單的方法來處理這個沒有rangy? – 2015-03-03 22:00:07
@AdrianZumbrunnen:我敲了一個等價物。 – 2015-03-04 02:13:40