使用 Javascript 突出显示页面上的文本

Posted

技术标签:

【中文标题】使用 Javascript 突出显示页面上的文本【英文标题】:Highlighting Text on a Page Using Javascript 【发布时间】:2021-12-01 18:22:08 【问题描述】:

我正在开发一个 Google Chrome 扩展程序,它将突出显示列表中的某些单词。但是,我无法突出显示这些词。我目前仅使用一个单词进行测试,但无济于事。我的代码永远不会超过 background.js 文件中的if ("undefined" != typeof localStorage)。它只是跳过它下面的整个代码部分。

popup.js

document.addEventListener("DOMContentLoaded", function() 
    loadKeywords();

    document.getElementById("buttonScan").addEventListener("click", function() 
        scanForWords();

        chrome.runtime.sendMessage(
            "message": "getWords",
            "remove": true
        );
    );
);

common.js

    function loadKeywords() 
    if ("undefined" != typeof localStorage) 
        localStorage.setItem("keywords", "washington");
        localStorage.setItem("foreground", "lightgrey");
        localStorage.setItem("background", "#ffff00");
        localStorage.setItem("numOfWords", true);


function scanForWords() 
    if ("undefined" != typeof localStorage) 
        localStorage.setItem("keywords", "washington");
        localStorage.setItem("foreground", "lightgrey");
        localStorage.setItem("background", "#ffff00");
        localStorage.setItem("numOfWords", true);
    

background.js

    chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) 
    if ("getWords" == request.message) 
        if ("undefined" != typeof localStorage) 
            chrome.tabs.query(
                    "active": true,
                    "currentWindow": true
                ,
                function(tabs) 
                    if ("undefined" != typeof tabs[0].id && tabs[0].id) 
                        var wordCount = localStorage.getItem("wordCount");
                        wordCount = "true" == showOccurrences || null == showOccurrences;

                        chrome.tabs.sendMessage(tabs[0].id, 
                            "message": "returnWords",
                            "remove": request.remove,
                            "keywords": localStorage.getItem("keywords"),
                            "foreground": localStorage.getItem("foreground") || "red",
                            "background": localStorage.getItem("background") || "#lightblue",
                            "showOccurrences": showOccurrences
                        );
                    
                
            );
        
    
);

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) 
    if ("numOfWords" == request.message) 
        var wordCount = localStorage.getItem("numOfWords");
        wordCount = "true" == wordCount || null == wordCount;

        chrome.browserAction.setBadgeText(
            "text": wordCount && request.occurrences ? String(request.occurrences) : "",
            "tabId": sender.tab.id
        );
    
);

content.js

    function keywordsHighlighter(options, remove) 
    var occurrences = 0;

    // Based on "highlight: javascript text higlighting jQuery plugin" by Johann Burkard.
    // http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
    // MIT license.
    function highlight(node, pos, keyword, options) 
        var span = document.createElement("span");
        span.className = "highlighted";
        span.style.color = options.foreground;
        span.style.backgroundColor = options.background;

        var highlighted = node.splitText(pos);
        /*var afterHighlighted = */highlighted.splitText(keyword.length);
        var highlightedClone = highlighted.cloneNode(true);

        span.appendChild(highlightedClone);
        highlighted.parentNode.replaceChild(span, highlighted);

        occurrences++;
    

    function addHighlights(node, keywords, options) 
        var skip = 0;

        var i;
        if (3 == node.nodeType) 
            for (i = 0; i < keywords.length; i++) 
                var keyword = keywords[i].toLowerCase();
                var pos = node.data.toLowerCase().indexOf(keyword);
                if (0 <= pos) 
                    highlight(node, pos, keyword, options);
                    skip = 1;
                
            
        
        else if (1 == node.nodeType && !/(script|style|textarea)/i.test(node.tagName) && node.childNodes) 
            for (i = 0; i < node.childNodes.length; i++) 
                i += addHighlights(node.childNodes[i], keywords, options);
            
        

        return skip;
    

    function removeHighlights(node) 
        var span;
        while (span = node.querySelector("span.highlighted")) 
            span.outerHTML = span.innerHTML;
        

        occurrences = 0;
    

    if (remove) 
        removeHighlights(document.body);
    

    var keywords = options.keywords.split(",");
    delete options.keywords;
    addHighlights(document.body, keywords, options);

    chrome.runtime.sendMessage(
        "message": "numOfWords",
        "occurrences": occurrences
    );


chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) 
    if ("returnWords" == request.message) 
        if ("undefined" != typeof request.keywords && request.keywords) 
            keywordsHighlighter(
                    "keywords": request.keywords,
                    "foreground": request.foreground,
                    "background": request.background
                ,
                request.remove
            );
        
    
);

chrome.runtime.sendMessage(
    "message": "getWords",
    "remove": false
);

非常感谢您在正确方向上的任何帮助。在过去的一个小时里,我一直在用头撞墙,试图弄清楚为什么它不会前进。

【问题讨论】:

你应该使用if(typeof localStorage !== "undefined") 这能回答你的问题吗? Chrome extension: store data on background 【参考方案1】:

我不知道 localStorage 是否在您的代码中的其他地方定义,但如果没有,您需要在清单中请求后通过 chrome. 访问它:


  "name": "My extension",
  ...
  "permissions": [
    "storage"
  ],
  ...

然后:

chrome.storage.local.set(key: value, function() 
  console.log('Value is set to ' + value);
);

chrome.storage.local.get(['key'], function(result) 
  console.log('Value currently is ' + result.key);
);

参考:https://developer.chrome.com/docs/extensions/reference/storage/

【讨论】:

以上是关于使用 Javascript 突出显示页面上的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何记录文本在页面上的位置?

使用 Javascript/JQuery 为移动网络(Android、iOS、Windows Phone)突出显示/选择元素上的文本

在滚动条上突出显示文本

如何突出显示图像中的文本?

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

使用javascript按下开始按钮时,我应该如何突出显示textarea中的文本?