javascript - Javascript 中的文本突出显示

标签 javascript jquery html selection

我有以下格式的文本:

<div id="text">
  <div>Hello world</div>
  <div>How are you</div>
</div>

用户选择世界的“w”:

所以我得到了选择并可以插入跨度:

var selection = window.getSelection();
var startNode = $(selection.anchorNode.parentElement);
var endNode = $(selection.focusNode.parentElement);
var startIndex = startNode.index();
var endIndex = endNode.index();
var startOffset = selection.anchorOffset;
var endOffset = selection.focusOffset;

结果:

<div id="test">
  <div>Hello <span class="id1">w</span>orld</div>
  <div>How are you</div>
</div>

id1.startNode = 0
id1.endNode = 0
id1.startOffset = 6
id1.endOffset = 7

用户用户现在选择文本中的“d Ho”。它应该是这样的:

<div id="test">
  <div>Hello <span class="id1">w</span>orl<span class="id2">d</span></div>
  <div><span class="id2">Ho</span>w are you</div>
</div>

id2.startNode = 0
id2.endNode = 1
id2.startOffset = 9
id2.endOffset = 2

但是使用之前的方法 selection.anchorOffset 会产生相对于新创建的文本节点的索引,这些文本节点现在是“Hello”、“w”和“orld”,这意味着我得到了一个索引3 个而不是 10 个。

我使用以下代码来获取创建的偏移量:

var offs = 0;
if(startNode.context.innerHTML.length > startNode.context.innerText.length) {
    var n = startNode.context.childNodes;
    for (var i = 0; i < n.length; i++) {
        if(n[i].textContent === selection.anchorNode.textContent) {
            break;
        }
        else {
            offs += n[i].textContent.length;
        }
    }
}
console.log(offs);

我现在可以在开始和结束处添加偏移量,但是当选择越过不同节点或其中包含选择时,这种情况就会中断。我也不知道如何使用这些偏移生成跨度。还有很多情况我必须考虑,例如 startNode === endNode 或者选择是否完全或部分包含跨度。

对于这样的事情有什么通用的方法或框架吗?我宁愿只使用纯文本索引而不是内部的 html 标签,并让其他东西处理正确的格式。

最佳答案

冒着 self 推销的风险,我的Rangy图书馆有一个Class Applier module专门为此。

关于javascript - Javascript 中的文本突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27989211/

相关文章:

javascript - 连接字符串并格式化输出

jquery - 使用 jQuery.ajax() 获取图像并将其解码为 base64

javascript - n 列表项 `inline-block` 后的 CSS 换行符

javascript - jQuery if语句检查一个值是否存在

html - 为什么这个 http 对话有 10 秒的延迟?

html - 如何调整文本宽度并将其放在帖子(视觉)编辑器的中心?

javascript - 想要在点击时突出显示分页链接。这是我的代码

javascript - 在nodejs中使用Q.js Promise进行循环的正确方法

javascript - 如何传递表单数据并重定向到另一个页面

jquery - 如何使用 CSS(jQuery SVG 图像替换)更改 SVG 图像的颜色?