javascript - 从 DOM 中删除添加的突出显示

标签 javascript google-chrome google-chrome-extension

我正在使用a script from Tim Down打造亮点。现在,我希望用户再次单击浏览器操作以将其删除。

我想我可以向此代码段添加另一个 if 语句:

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, '#FFFF00')) {
        document.execCommand("BackColor", false, '#FFFF00');
    }
    if (!document.execCommand("HiliteColor", true, '#FFFF00')) {  // Added this logic
        document.execCommand("removeFormat", false, null);
    }
    document.designMode = "off";
}

我的想法是,如果 "HiliteColor" 返回 true,它将删除格式,但它不起作用。有什么想法吗?

编辑 经过更多阅读后,我了解到 execCommand 中的 bool 值与返回值没有任何关系。如何改进我的逻辑来反转背景颜色?这可行吗?

最佳答案

您需要一种方法来“序列化”所选范围以供以后访问。
<强> This answer 解释了如何实现序列化/反序列化。

您的代码可能如下所示:

var serializedRange;

/* Serializes and returns the specified range
 * (ignoring it if its length is zero) */
function serializeRange(range) {
    return (!range || ((range.startContainer === range.endContainer)
                       && (range.startOffset === range.endOffset)))
            ? null : {
                startContainer: range.startContainer,
                startOffset:    range.startOffset,
                endContainer:   range.endContainer,
                endOffset:      range.endOffset
            };
}

/* Restores the specified serialized version
 * (removing any ranges currently seleted) */
function restoreRange(serialized) {
    var range = document.createRange();
    range.setStart(serialized.startContainer, serialized.startOffset);
    range.setEnd(serialized.endContainer, serialized.endOffset);

    var sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);
}

/* Hilites the currently selected range or removes the hilite
 * (if there is a previously serialized range) */
function toggleHilite() {
    document.designMode = 'on';

    var sel = window.getSelection();
    if (serializedRange) {
        /* There is a hilited range, let's remove the hilite */
        restoreRange(serializedRange);
        serializedRange = null;
        document.execCommand('removeFormat', false, null);
        sel.removeAllRanges();
    } else {
        /* There is no hilited range, so hilite
         * the currently selected range (if any) */
        if (sel.rangeCount && sel.getRangeAt) {
            document.execCommand('hiliteColor', false, '#FFFF00');
            serializedRange = serializeRange(sel.getRangeAt(0));
            // it is important to serialize the range *after* hiliting,
            // because `execCommand` will change the DOM affecting the
            // range's start-/endContainer and offsets.
        }
    }

    document.designMode = 'off';
}

关于javascript - 从 DOM 中删除添加的突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21441524/

相关文章:

javascript - 如何从 JavaScript 发送没有基本 URL 的请求? (SAP 图形用户界面)

linux - Xvfb (xvfb-run) 不正确的分辨率

python - selenium.common.exceptions.SessionNotCreatedException : Message: session not created: This version of ChromeDriver only supports Chrome version 85

google-chrome - 与 Chrome 相比,为什么 Firefox 生成的 WebM 视频文件更大?

javascript - Chrome 在打开时加载扩展程序与我手动重新加载扩展程序

javascript - 我如何知道在上下文菜单中单击了哪个元素?

javascript - 使用 getUserMedia 后关闭网络摄像头/相机

php - 缓存通过 PHP/AJAX/JSON/jQuery 加载的动态图像

javascript - 响应式语音 jquery 插件在循环内不起作用

javascript - 按下后退按钮时 Firefox 会记住文档修改