如何从 contenteditable 中获取“插入符号位置”?

Posted

技术标签:

【中文标题】如何从 contenteditable 中获取“插入符号位置”?【英文标题】:How can I get the "drop caret position" from contenteditable? 【发布时间】:2016-07-12 09:38:18 【问题描述】:

如果从contenteditable 中拖动一个元素,浏览器通常会显示如下图所示的“中间插入符号”:

我正在寻找一种简单可靠的解决方案,通过拖放将元素 ID 作为传输数据发送到 contenteditable 中拖动元素。然后,在ondrop 方法中,我打算将draggable 放在这个“中间插入符号”当前所在的确切位置。

问题是:我能否从所有浏览器中获取这些信息?

我确实有一个基础 (JSFiddle),但目前对我来说还远远没有用处。

PS:我没有使用 jQuery 或任何其他库。

【问题讨论】:

我可以制作这个:jsfiddle.net/jkLhfzr8,这就是你想要的吗? @dandavis 天哪,这真是天才!这应该适用于所有浏览器,对吧?看起来他们中的大多数人都会支持这一点的机会很好。我现在正在寻找一个简单的解决方案,到目前为止最有希望的解决方案是this ..我也在考虑简单地切换元素但是我无法做到这一点。让我检查一下这个解决方案,但这对我来说似乎是 the 答案! :) @dandavis 谢谢老兄!我想我会同意的,请写一个博客或关于这个的东西,因为老实说......做一些简单的事情真的花了我一段时间才知道如何做。您也可以提供您的答案here,因为它们密切相关。 我认为它适用于所有 DND 浏览器,我什至避免使用 elm.remove() 并改用向后兼容的 parent.removeChild... @dandavis 太棒了!随时提供答案! :) 【参考方案1】:

查看document.caretRangeFromPointe.rangeParent, e.rangeOffset

这是一个演示 https://jsfiddle.net/znghofxt

function dragElement(e) 
  e.dataTransfer.setData('text/plain', e.target.id);


function drop(e) 
  e.preventDefault();
  var id = e.dataTransfer.getData("text/plain");
  if (document.caretRangeFromPoint) 
    // edge, chrome, android
    range = document.caretRangeFromPoint(e.clientX, e.clientY)
   else 
    // firefox
    var pos = [e.rangeParent, e.rangeOffset]
    range = document.createRange()
    range.setStart(...pos);
    range.setEnd(...pos);
  

  range.insertNode(document.getElementById(id));
.fancy 
  background-color: #123456;
  color: white;
  border-radius: 8px 8px 8px 8px;
  cursor:pointer; 
  display: inline-block;
  padding: 20px;


.fancy-img 
  cursor:pointer; 
  display: inline-block;
<div contenteditable="true" ondrop="drop(event)">   
  More blah
  about 
  <a id="dragme" href="http://www.google.com" class="fancy" contenteditable="false" ondragstart="dragElement(event)">       
    :(
  </a>
  Sparta!
</div>

【讨论】:

以上是关于如何从 contenteditable 中获取“插入符号位置”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 contentEditable 获取 iframe 中当前插入符号位置的像素偏移量

如何在 IE 的 contentEditable div 中获取选定的文本节点?

如何在 IE 的 contentEditable div 中获取选定的文本节点?

如何获取 ContentEditable 区域中的行数和当前插入符号行位置?

如何使用 html 子元素在 contenteditable div 中获取插入符号位置?

如何避免从 jQuery 中的 contenteditable <p> 中删除键入的文本