javascript - 获取#document-fragment 的 innerHTML 而不是 textContent

标签 javascript html css contenteditable

我有一个 contenteditable p 标签。当提取 p 标签的内容并将其插入另一个标签时,原始标签的所有标记都将丢失。有什么办法可以保存标记吗?

请注意,如果插入符号是段落中的第 i 个 位置,则字符将从该位置开始提取到结尾

function select() {
    var el = document.getElementById('p');
    el.focus();

    var sel = window.getSelection();
    var selRange = sel.getRangeAt(0);

    var range = selRange.cloneRange();
    range.selectNodeContents(el);
    range.setStart(selRange.endContainer, selRange.endOffset);

    document.getElementById('other').innerHTML = (range.extractContents().textContent);
    // return range.extractContents().textContent;
}
p {
	background-color: #eee;
}

.red {
  color: red;
}
<p id="p" contenteditable="true">This is <i>a</i> <span class="red">paragraph</span> <b>with</b> lots of markup.</p>
<p id="other"></p>
<button onclick="select()">SELECT</button>

最佳答案

range.extractContents()返回 DocumentFragment .

DocumentFragment 没有 innerHTML属性(property)。 innerHTML 来自 Element界面,同时 textContentNode 的一部分界面。 DocumentFragment 继承自 Node,但不是 Element

这意味着您可以附加整个片段,因为它是一个节点:

function select() {
  var el = document.getElementById('p');
  el.focus();

  var sel = window.getSelection();
  var selRange = sel.getRangeAt(0);

  var range = selRange.cloneRange();
  range.selectNodeContents(el);
  range.setStart(selRange.endContainer, selRange.endOffset);

  //document.getElementById('other').innerHTML = (range.extractContents().textContent);
  var frag = range.extractContents();
  var i;
  var node;
  var other = document.getElementById('other');
  other.innerHTML = '';
  other.appendChild(frag);
}
p {
	background-color: #eee;
}

.red {
  color: red;
}
<p id="p" contenteditable="true">This is <i>a</i> <span class="red">paragraph</span> <b>with</b> lots of markup.</p>
<p id="other"></p>
<button onclick="select()">SELECT</button>

关于javascript - 获取#document-fragment 的 innerHTML 而不是 textContent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36653316/

相关文章:

javascript - 是否可以为不同的文件配置不同的JavaScript语言版本?

javascript - 尝试使用 suitescript 访问 Netsuite 中的子列表

html - 识别 Html 标记并替换其在 vb.net 中的元素

javascript - 更改顺序 js 将文本插入 html

javascript - CSS 样式仅适用于 iOS 网络应用程序?

css - -moz-linear-gradient with PNG background over top

javascript - 为什么我的复选框上的 <required> 属性不工作,尽管已经设置了一些 JS 代码使其成为一个要求?

javascript - 数据表延迟加载,分页不起作用

javascript - 循环确定 selectedIndex 不起作用?

javascript - 每次创建或更新后使用 mongoose 存储日志数据