小编典典

如何突出显示DOM Range对象的文本?

javascript

我使用鼠标在html页面(在firefox中打开)上选择一些文本,并使用javascript函数创建/获取与所选文本相对应的rangeobject。

 userSelection =window.getSelection(); 
 var rangeObject = getRangeObject(userSelection);

现在我要突出显示rangeobject下的所有文本。

  var span = document.createElement("span");
  rangeObject.surroundContents(span);
  span.style.backgroundColor = "yellow";

好吧,这仅在rangeobject(起点和终点)位于同一textnode时有效,然后突出显示相应的文本。

    <p>In this case,the text selected will be highlighted properly,
       because the selected text lies under a single textnode</p>

但是,如果range对象覆盖多个文本节点,则它不能正常工作,它仅突出显示第一个textnode中的文本,例如

 <p><h3>In this case</h3>, only the text inside the header(h3) 
  will be highlighted, not any text outside the header</p>

我知道如何使rangeobject下的所有文本突出显示,而与range是位于单个节点还是多个节点无关?谢谢....


阅读 308

收藏
2020-05-01

共1个答案

小编典典

我建议使用documentTextRangeexecCommand方法,该方法就是为此目的而构建的,但通常在可编辑文档中使用。这是我对类似问题的回答:

以下应该做您想要的。在非IE浏览器中,它会打开designMode,应用背景色,然后再次关闭designMode。

更新

修复了在IE 9中的工作。

更新

function makeEditableAndHighlight(colour) {
    var range, sel = window.getSelection();
    if (sel.rangeCount && sel.getRangeAt) {
        range = sel.getRangeAt(0);
    }
    document.designMode = "on";
    if (range) {
        sel.removeAllRanges();
        sel.addRange(range);
    }
    // Use HiliteColor since some browsers apply BackColor to the whole block
    if (!document.execCommand("HiliteColor", false, colour)) {
        document.execCommand("BackColor", false, colour);
    }
    document.designMode = "off";
}

function highlight(colour) {
    var range;
    if (window.getSelection) {
        // IE9 and non-IE
        try {
            if (!document.execCommand("BackColor", false, colour)) {
                makeEditableAndHighlight(colour);
            }
        } catch (ex) {
            makeEditableAndHighlight(colour)
        }
    } else if (document.selection && document.selection.createRange) {
        // IE <= 8 case
        range = document.selection.createRange();
        range.execCommand("BackColor", false, colour);
    }
}
2020-05-01