Javascript 如何确定某个元素是否直接围绕文本选择范围,如果是,它是什么元素?

Javascript 如何确定某个元素是否直接围绕文本选择范围,如果是,它是什么元素?,javascript,dom,text,wysiwyg,textselection,Javascript,Dom,Text,Wysiwyg,Textselection,我正在开发一个富文本编辑器,可以按照Aloha的思路嵌入到网页中。当前我遇到的问题是,当围绕用户创建的文本选择插入或更新链接时,我需要知道该选择周围是否已经存在链接,以便我可以分别进行更新或插入 例如,假设方括号([和])表示选定范围的边界: 案例1: this is [some unlinked text] 案例2: this is <a href='stackoverflow.com'>some [linked] text</a> 这是 案例3: this is

我正在开发一个富文本编辑器,可以按照Aloha的思路嵌入到网页中。当前我遇到的问题是,当围绕用户创建的文本选择插入或更新链接时,我需要知道该选择周围是否已经存在链接,以便我可以分别进行更新或插入

例如,假设方括号([和])表示选定范围的边界:

案例1:

this is [some unlinked text]
案例2:

this is <a href='stackoverflow.com'>some [linked] text</a>
这是
案例3:

this is <a href='stackoverflow.com'>[some linked text]</a>
这是
在案例1和案例2中,我想知道没有一个元素会立即包围选定的文本,而在案例3中,我想得到一个锚定标记,它会立即包围选定的文本。我想知道一个高效的跨浏览器解决方案会是什么样子

另外,我知道
Range
对象有一个
commonAncestorContainer
属性,但有时该属性引用文本节点而不是元素节点。

使用jQuery:

getWrappingElement = function(range) {
  var $wrapper;

  $wrapper = $(range.commonAncestorContainer);

  // handle cases in which range.commonAncestorContainer is a text node
  if ($wrapper.parent().text().trim() === range.toString().trim()) {
    $wrapper = $wrapper.parent();
  }

  if ($wrapper.get(0).nodeType === document.ELEMENT_NODE) {
    return $wrapper;
  } else {
    return false;
  }
}
其中
range
range
对象