简体   繁体   English

使用Chrome内容脚本扩展程序替换网站中的文字

[英]Replace text in website with Chrome content script extension

I would like to create Google Chrome extension. 我想创建Google Chrome扩展程序。 Its job is to replace a word with another on all websites. 它的工作是在所有网站上用另一个词替换一个词。

I have the following manifest.json file: 我有以下manifest.json文件:

{
  "name": "My extension",
  "version": "1.0",
  "background_page": "background.html",
  "permissions": [
    "tabs", "http://*/*"
  ],
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["myscript.js"],
      "run_at": "document_end"
    }
  ]
}

and the javascript in myscript.js is: 和myscript.js中的javascript是:

< script type="text/javascript" >
    document.body.innerHTML = document.body.innerHTML.replace("uno", "dos");
< /script >

However this does not function.. and I cannot find a way to debug the content script, only the background.html 但是这不起作用..我找不到调试内容脚本的方法,只有background.html

I took the example from JavaNut13 and Matt Curtis to create an alias hider extension for Reddit, and updated it for the new manifest 2. It looks for user on Reddit named "user1" and replaces it with "nobody". 我从JavaNut13和Matt Curtis的示例中为Reddit创建了一个别名hider扩展,并为新清单2更新了它。它在Reddit上查找名为“user1”的用户并将其替换为“nobody”。 Modify as you need. 根据需要进行修改。

manifest.json 的manifest.json

{
  "name": "No Alias",
  "version": "0.1",
  "permissions": [
    "https://www.reddit.com/*"
  ],
  "content_scripts": [
    {
      "matches": ["https://www.reddit.com/*"],
      "js": ["myscript.js"],
      "run_at": "document_end"
    }
  ],
  "manifest_version": 2
}

myscript.js myscript.js

document.body.innerHTML = document.body.innerHTML.replace(new RegExp("user1", "g"), "nobody");

I have actually written this in jQuery: (Making sure you have the correct include tag) 我实际上是用jQuery编写的:(确保你有正确的include标签)

var replaced = $("body").html().replace(/text/g,'replace');
$("body").html(replaced);

Replacing/changing text within the DOM on this scale should not be done with blunt HTML-regex replacement, which is very unsafe. 在此范围内替换/更改DOM中的文本不应该使用钝的HTML-regex替换,这是非常不安全的。 You risk mutilating the HTML in the process. 您可能会在此过程中破坏HTML。

What you need to do is loop over every TextNode ( Node ) within the document, modifying the text within them. 您需要做的是遍历文档中的每个TextNode( Node ),修改其中的文本。

Your code will end up looking something like this: 您的代码最终会看起来像这样:

var replaceTextInNode = function(parentNode){
    for(var i = parentNode.childNodes.length-1; i >= 0; i--){
        var node = parentNode.childNodes[i];

        //  Make sure this is a text node

        if(node.nodeType == Element.TEXT_NODE){
            node.textContent = /* modify text here */
        } else if(node.nodeType == Element.ELEMENT_NODE){
            //  Check this node's child nodes for text nodes to act on

            replaceTextInNode(node);
        }
    }
};

replaceTextInNode(document.body);

Use the DOM and modify the data of the appropriate Text nodes. 使用DOM并修改相应Text节点的data Eg 例如

document.body.querySelector(".number").firstChild.data = "dos";
var matchText = function(node, regex, callback, excludeElements) { 

    excludeElements || (excludeElements = ['script', 'style', 'iframe', 'canvas', 'a']);
    console.log("Node name " + node.nodeName);
    var child = node.firstChild;

    while (child) 
    {
        switch (child.nodeType) 
        {
        case 1:
            if (excludeElements.indexOf(child.tagName.toLowerCase()) > -1)
                break;
            matchText(child, regex, callback, excludeElements);
            break;
        case 3:
            var bk = 0;
            child.data.replace(regex, function(all) 
            {
                var args = [].slice.call(arguments),
                    offset = args[args.length - 2],
                    newTextNode = child.splitText(offset+bk), tag;
                bk -= child.data.length + all.length;

                newTextNode.data = newTextNode.data.substr(all.length);
                tag = callback.apply(window, [child].concat(args));
                child.parentNode.insertBefore(tag, newTextNode);
                child = newTextNode;
            });
            regex.lastIndex = 0;
            break;
        }
        child = child.nextSibling;
    }

    return node;
};

matchText(document.body, new RegExp("(?:(?:\\+|0{0,2})91(\\s*[\\- ]\\s*)?|[0 ]?)?[789]\\d{9}|(\\d[ -]?){10}\\d", "g"), function(node, match, offset) {
    var newAnchor = document.createElement("a");
    newAnchor.className = "search-term";
    //newAnchor.textContent = match;
    newAnchor.href = "tel:" + match.replace( /(\s|-)/g, "");
    newAnchor.innerHTML = '<img src =' + chrome.extension.getURL("call_icon_10x10.png")+'> ' + match;
    return newAnchor;
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM