首页 > web前端 > js教程 > 正文

如何在 ContentEditable Div 的光标处插入 HTML?

DDD
发布: 2024-11-11 03:42:02
原创
603 人浏览过

How to Insert HTML at the Cursor in a ContentEditable Div?

在 ContentEditable Div 的光标处插入 HTML

使用允许编辑的 div 时,您可能需要直接在以下位置插入 HTML光标。虽然像 insertText() 这样的方法可以添加纯文本,但浏览器通常会将以此方式插入的 HTML 显示为文本,而不是执行它。

要克服此限制,需要更复杂的方法。一种解决方案涉及利用 Range 对象的 insertNode() 方法。然而,IE8及以下版本依赖于pasteHTML()。

实现

以下函数处理跨主要浏览器的HTML插入:

function pasteHtmlAtCaret(html) {
  // Obtain the selection range
  var sel, range;
  if (window.getSelection) {
    // For non-IE browsers
    sel = window.getSelection();
    range = sel.getRangeAt(0);
  } else if (document.selection) {
    // For IE8 and below
    range = document.selection.createRange();
  }

  // Delete existing content in the range
  range.deleteContents();

  // Create an element to hold the HTML
  var el = document.createElement("div");
  el.innerHTML = html;
  
  // Create a fragment to insert
  var frag = document.createDocumentFragment();

  // Loop through elements in the div
  while ((node = el.firstChild)) {
    frag.appendChild(node);
  }
  
  // Insert the fragment into the range
  range.insertNode(frag);

  // Position the caret after the inserted content
  range = range.cloneRange();
  range.setStartAfter(frag.lastChild);
  range.collapse(true);
  if (sel) sel.removeAllRanges();
  if (sel) sel.addRange(range);
}
登录后复制

改进

基于用户请求,开发了带有附加参数的更新版本:

function pasteHtmlAtCaret(html, selectPastedContent) {
  // ... (same as before)

  // Modify based on parameter
  if (selectPastedContent) {
    range.setStartBefore(frag.firstChild);
  } else {
    range.collapse(true);
  }

  // Update the selection
  sel.removeAllRanges();
  sel.addRange(range);
}
登录后复制

设置为 true 时,此参数允许您在执行时选择插入的内容。

以上是如何在 ContentEditable Div 的光标处插入 HTML?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板