JQuery / Javascript - 突出显示文本并包装标签,而不更改html结构

时间:2016-01-22 20:11:41

标签: javascript jquery html text highlight

我正在尝试创建一个程序,用户可以在其中突出显示文本以进行注释。 无论用户在哪里突出显示文字,我希望文本保持不变。

与此网站类似的内容:http://genius.com/Future-hater-shit-lyrics

当我尝试在某些html标签中突出显示文本时,它可以正常工作。 但是当我在一个或多个html标签上突出显示文本时,html结构会发生变化。我希望这适用于所有html标签,因为html结构可能会有所不同。有办法防止这种情况吗?

如果我不清楚,我会做一个小提琴:https://jsfiddle.net/4a1x4t3y/

抱歉我的英文。

function highlightText(){

var selectedText, selectionEl, sel, range;

if (typeof window.getSelection != "undefined") {
    selectedText = window.getSelection().toString();
} 
else if (typeof document.selection != "undefined" && document.selection.type == "Text") {
    selectedText = document.selection.createRange().text;
}

if (document.selection && document.selection.createRange) {

    range = document.selection.createRange().duplicate();
    range.collapse(false);

} else if (window.getSelection) {
    sel = window.getSelection();

    if (sel.getRangeAt) {
        range = sel.getRangeAt(0).cloneRange();

    } else {
        range.setStart(sel.anchorNode, sel.anchorOffset);
        range.setEnd(sel.focusNode, sel.focusOffset);

        if (range.collapsed !== sel.isCollapsed) {
            range.setStart(sel.focusNode, sel.focusOffset);
            range.setEnd(sel.anchorNode, sel.anchorOffset);
        }
    }

  var a = document.createElement('a');
  a.textContent = selectedText;
  a.href = "#";

  range.deleteContents();
  range.insertNode(a);
  range.collapse(false);
}
}

$("#article").mouseup(function(){
   highlightText();
});

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题。

  1. 使用< br />用于分隔段落的标签而不是< p>标签

    例如:https://jsfiddle.net/asagex/4a1x4t3y/1/

  2. 当您选择文字时,请创建多个标签。

  3. 此:

    <p> My text of (SELECT START) doom.</p>
    <p>More text (SELECT END) and what not </p>
    

    会变成:

    <p>My text of <a href="">doom.</a ></p>
    <p><a href="">More text</a> and what not </p>
    

    第二个更容易,但仅适用于段落标签。如果您打算使用span标签,那么第二个选项是您最好的选择。