我想删除<b>
标记并将其添加到选定的文本中,只需点击它即可。
我已经可以通过以下方式将选定的文字括在<b>
代码中:
if (window.getSelection)
{
selection = getSelection();
var newNode = document.createElement("b");
range.surroundContents(newNode);
}
既然那时我想要一种方法来删除我之前添加的<b>
标记,但使用range.commonAncestorContainer
的常用方法会给我<div>
的最低父级类型。
作为调试的一部分,我只是修改了我用来添加<b>
标记的代码(以确保我有一个标记,我也首先添加了它)来删除父节点。
if (window.getSelection) {
selection = getSelection();
var newNode = document.createElement("b");
range.surroundContents(newNode);
node = range.commonAncestorContainer;
node.remove();
}
这将删除新添加的<div>
代码的父<b>
,而不是<b>
代码本身。
供参考,这是HTML:
<div contenteditable="true" id="input" class="inputblock" onclick="getClick()" onkeypress="changeNodeType(event)" data-text="Please paste your text here."></div>
<b>
标记将在粘贴到显示的<div>
中的文字中创建。
可以忽略它也删除内容的事实。我找到了解决这个问题的方法。
答案 0 :(得分:1)
我遗憾的是,我没有时间花在编写完整的代码解决方案上,但这就是我过去解决这个问题的方法:
NodeIterator
进行有序遍历并转到启动容器的下一个节点,以及最终容器的上一个节点。这解决了当您选择<b>hello</b>
之类的内容时,选择可以是|<b>hello</b>|
或<b>|hello|</b>
。通过规范化并沿着树走下去,在两种情况下,最终都会得到<b>|hello|</b>
的选择。很难在没有图片的情况下解释这一点,所以我鼓励你绘制DOM树并走到开始容器的下一个最里面的子节点和最终容器的前一个最里面的子节点。
node.contains('b')
; 这是一个非常重要的代码量,并且需要进行大量测试,因为在浏览器中设置选择和范围时,边缘情况非常糟糕。我已经争取了很长一段时间:-)我祝你好运