插入节点时如何找到最近的父节点
How to find the nearest parent when inserting Node?
假设我有以下文本:
你好,
<span class='blue_mark'>
,我叫Bob</span>
。
假设我想用.red_mark
高亮显示Bob。当我这样做时,最近的父节点将是.blue_mark
而不是主父节点。我想计算这个,因为我不想让任何跨度嵌套在一起。
这是我的代码:
var selection = document.getSelection();
var range = selection.getRangeAt(0);
var contents = range.extractContents();
var node = document.createElement('span');
node.classList.add('blue_mark');
node.appendChild(contents);
range.insertNode(node);
selection.removeAllRanges(); //Clear the selection, showing highlight
在insertNode之前,我想检查span是否嵌套在另一个span中。如果是这样,就不要插入并弹出提示。如果没有,则插入内容/
基本上,你不希望有任何重叠的span。所以:
- 选择的开始不能在span
- 选择的结束不能在span
- 选择不能完全包含span
首先是效用函数:
function isInSpan(node) {
if (node && node.nodeType === 3) {
node = node.parentNode;
}
while (node && node.nodeType === 1) {
if (node.nodeName.toUpperCase() === "SPAN") {
return true;
}
node = node.parentNode;
}
return false;
}
那么,我相信你可以这样检查:
if (isInSpan(range.startContainer) ||
isInSpan(range.endContainer) ||
range.cloneContents().querySelector("span")) {
// Do the alert
} else {
// Go ahead and create the span
}
(惊喜地看到querySelector
出现在DocumentFragment
上)
相关文章:
- jQuery最近父级的数据属性选择器
- 在自定义截面树中获取父节点
- 如何避免在取消选中子节点时取消选中父节点
- 如果未选中子节点,则未选中父节点
- 仅使用某些子节点访问xml中父节点的子节点
- 如何以编程方式在 jsTree 中选择一个节点并打开所有父节点
- 使用Javascript设置带有子节点的父节点的类's文本等于.
- 如何确定父节点是否有子节点
- Javascript在没有jQuery的情况下获取X父节点
- 如何从wijmo-flex网格的树视图中的节点转到父节点
- 在没有 jquery 的情况下更改子节点(父节点具有 ID)中的链接文本
- JQuery 选择父节点并更改其类名
- 如何删除javascript中的节点,而不需要父节点为null
- 如果未全部选中子节点,则取消选中父节点
- 如何在JavaScript中删除子节点触发点击事件时的父节点
- 获取下一个不工作Javascript DOM的同级父节点的子节点
- 取消绑定父节点和子节点
- jstree jquery插件-获取父节点的所有子节点和子节点
- 使用jquery检索父节点的子节点
- 插入节点时如何找到最近的父节点