我使用鼠标在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是位于单个节点还是多个节点无关?谢谢....
我建议使用document或TextRange的execCommand方法,该方法就是为此目的而构建的,但通常在可编辑文档中使用。这是我对类似问题的回答:
document
TextRange
execCommand
以下应该做您想要的。在非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); } }