我正在编写一个模块,它应该允许用户选择 HTML 文档的一部分。为了让内部工作正常,我将Range
选择扩展为有效的 HTML 片段。
对于 B 是 AI 的后代的情况,找到 B 的祖先,它是 A 的孩子,并希望使用 setEndAfter 将范围设置为在该节点之后结束。这就是我现在所拥有的:
var closestChild = function (node, descendant) {
var parent;
if (descendant.parentElement) {
parent = descendant.parentElement;
if ( node === parent ) {
return descendant;
}
return closestChild(node, parent);
}
return false;
}
var legalRange = function (range) {
var newRange = range.cloneRange(),
child;
if (range.startContainer === range.endContainer) {
return newRange;
}
child = closestChild(range.startContainer.parentElement, range.endContainer.parentElement);
if (child) {
newRange.setEndAfter(child);
return newRange;
}
return null;
};
INVALID_NODE_TYPE_ERR: DOM Range Exception 2
但是当我尝试设置终点时,这会引发 。我也尝试使用 parentNode 而不是 parentElement 并引发相同的异常。如果我使用 setEnd(),这不是问题。我应该传递什么类型的节点来执行此操作。
PS:事实证明,代码在 FireFox 中有效,所以我现在的问题是 Safari 和 Chrome。