如何查找元素是不是立即围绕文本选择范围,如果是,它是啥元素?

Posted

技术标签:

【中文标题】如何查找元素是不是立即围绕文本选择范围,如果是,它是啥元素?【英文标题】:How do I find if an element is immediately surrounding a text selection range, and if so, what element it is?如何查找元素是否立即围绕文本选择范围,如果是,它是什么元素? 【发布时间】:2014-05-20 03:22:02 【问题描述】:

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

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

案例一:

this is [some unlinked text]

案例 2:

this is <a href='***.com'>some [linked] text</a>

案例 3:

this is <a href='***.com'>[some linked text]</a>

在情况 1 和 2 中,我想知道没有立即包围所选文本的元素,在情况 3 中,我想获取紧接所选文本周围的 ANCHOR 标记。我想知道一个高效的跨浏览器解决方案会是什么样子。

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

【问题讨论】:

【参考方案1】:

使用 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;
  

其中rangeRange 对象。

【讨论】:

以上是关于如何查找元素是不是立即围绕文本选择范围,如果是,它是啥元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过列表索引超出范围错误而不是立即停止代码?

使用 Selenium Webdriver 通过它包含的文本选择一个元素

查找具有值范围的 k 个最大元素的有效算法

jquery判断iframe元素是不是在可视范围如果不是则滑动到可视区域

查找带有文本的元素,然后在其上方的许多级别中选择元素

在 React 中查找文本元素的颜色