删除页面中所有文本的背景色,无论我们是否有选择

Removing background-color from all the text in the page, regardless whether we have a selection or not

本文关键字:我们 有选择 是否 背景色 文本 删除      更新时间:2023-09-26

我们有以下Javascript代码:

function makeEditableAndHighlight(colour) {
    sel = window.getSelection();
    if (sel.rangeCount && sel.getRangeAt) {
        range = sel.getRangeAt(0);
    document.designMode = "on";
        sel.removeAllRanges();
        sel.addRange(range);
    }
    if (!document.execCommand("HiliteColor", false, colour)) {
        document.execCommand("BackColor", false, colour);
    }
    document.designMode = "off";
}
// This is the highlighting function. It takes a color as an argument.
function highlight(colour) {
    var range, sel;
    if (window.getSelection) {
        try {
            if (!document.execCommand("BackColor", false, colour)) {
                makeEditableAndHighlight(colour);
                window.getSelection().removeAllRanges();
            }
        } catch (ex) {
            makeEditableAndHighlight(colour)
        }
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        range.execCommand("BackColor", false, colour);
    }
}

// This returns the highlight to transparent (no highlighting) when the user clicks away in the document.
function body() {
    document.getElementsByTagName("body")[0].addEventListener(
    "click", 
    function(event){
      highlight('transparent');
    }
  );
}

它是这样工作的:

当页面中有文本被选中时,如果你按下一个按钮(比如一个扩展弹出窗口),那么该文本就会变成黄色高亮显示,并被自动取消选中。

这就是问题的症结所在。

因为文本被自动取消选择,我无法将高亮显示恢复为相同的文本(因为不再有选择)

因此,这个问题的重点是最后一部分,即:

function body() {
    document.getElementsByTagName("body")[0].addEventListener(
    "click", 
    function(event){
      highlight('transparent');
    }
  );
}

只有当我选择相同的文本并单击文档中的任何位置时,这才有效。

我希望它的工作方式是能够单击文档中的任何位置,并将任何突出显示的文本设置回原始文本(如果无法设置为原始文本,则设置为透明文本)。

我的目标是任何文本,因为我在这里没有选择。

所以基本上这个功能应该是这样工作的:

如果存在选择并按下按钮>高亮显示选择并自动删除所有选择。

当点击注册在页面中的任何位置时,无论是否有选择,都要删除任何文本上的突出显示。

同样,在最后一部分,即"删除任何突出显示"部分之前,这段代码似乎运行得很好。

您可以将对从body突出显示的调用替换为具有一个全局参数prevRange。然后在调用之后将prevRange重置为未定义。

高亮的签名可以是

功能突出显示(颜色,旧范围){

并像一样启动

function highlight(colour, oldRange) {
    var range, sel, oldSelection;
    if (typeof(oldRange) !== 'undefined') {
        oldSelection = window.getSelection();     
        oldSelection.removeAllRanges();   
        oldSelection.addRange(oldRange);
    }
    sel = oldSelection || window.getSelection(); 
    if (sel) {  

该函数的其余部分可以使用sel
旧的范围需要在取消选择之前存储在prevRange中,makeEditableAndHighlight也可以获得可选参数oldRange(并进行类似于"function highlight(color,oldRange){"签名后的测试)