【发布时间】:2021-04-13 00:48:33
【问题描述】:
我正在构建的浏览器扩展需要在某些文本位(通常是单个单词)周围插入 span 元素。
例如,对于某些输入 HTML,例如 <p>This is some text</p>,它可能会生成 <p>This is some <span class="insertedByMe">text</span></p>。
REST API 通过字符偏移告诉浏览器扩展将这些span 元素放在哪里。在上面的示例中,单词“text”跨越了字符偏移量[13, 17],因此服务器会告诉扩展程序它应该将范围放在这些偏移量周围。注意:这些字符偏移目前仅与实际文本相关,不包括任何标记,尽管可以在服务器端进行更改。
我的问题:如何在给定的字符偏移处插入 HTML 标签?这是否可能,最好不破坏我要替换的元素上的任何侦听器?另请注意,我不能单独处理文本节点,因为我总是需要至少包含单词的句子的上下文,并且我不能假设单个文本节点总是包含整个句子(因为链接,标记等)。
奖励:上面的例子是一个非常简单的例子。当我处理更多嵌套的 HTML 元素时,事情可能会变得更棘手,或者当在其他已经以某个偏移量开始或结束的 HTML 元素之前或之后放置 span 变得模棱两可时(因为偏移量不计算标记)。请参见下面的示例。非常欢迎任何帮助我处理这些更复杂案例的建议!
<div>
Some text here without any enclosing p element.
<p>Some <b>more text</b></p>
</div>
Server response: put spans around offsets [[5, 9], [59, 63]] (the two occurrences of the word "text")
挑战:
- 第一个跨度将被放入作为
div的直接子级的文本节点中,因此该文本节点的父元素也是包含第二个跨度的文本的祖先。我认为当我替换div的整个内部 HTML 时,这可能会出现问题,因为它会重新加载所有子级,可能会破坏侦听器。 - 第二个 span 的结束标记必须插入 在结束
b标记之前,以保护有效的 HTML,而两个结束标记都位于字符偏移量 63 处。
【问题讨论】:
-
所有你需要得到一个元素的偏移量来注入另一个元素的代码?这正是你需要的吗?
-
是的,这有很长的路要走,有点是我目前的实现。但如果可能的话,我想避免重新加载父元素,以免破坏其上的任何侦听器。不过不确定这是否可能。
-
只要 jquery 让你用 Offset() 注入你的代码我认为它可以做到here 你可以找到一个如何使用 jquery 更改元素偏移量的示例,你可以替换代码为了达到你的目标,如果你失败了,n为你做一个
-
设置一个元素的 innerHTML 属性,不应该删除任何已经存在的事件处理程序。
-
“非常欢迎任何可以帮助我处理这些更复杂案例的建议!” - 那么您可能应该首先提供此类案例的适当示例。不是口头描述,而是实际代码,以及随之而来的偏移数据。
标签: javascript html jquery dom