Замена текста на веб-сайте с расширением Chrome content script
Я хотел бы создать расширение Google Chrome. Его задача-заменить слово другим на всех веб-сайтах.
у меня есть следующий манифест.файл 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"
}
]
}
и javascript в myscript.js is:
< script type="text/javascript" >
document.body.innerHTML = document.body.innerHTML.replace("uno", "dos");
< /script >
однако это не работает.. и я не могу найти способ отладить сценарий содержимого, только фон.HTML-код
5 ответов
Я взял пример из JavaNut13 и Мэтта Кертиса, чтобы создать расширение псевдонима hider для Reddit, и обновил его для нового манифеста 2. Он ищет пользователя на Reddit с именем " user1 "и заменяет его на"Никто". Измените как вам нужно.
манифест.в 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
document.body.innerHTML = document.body.innerHTML.replace(new RegExp("user1", "g"), "nobody");
Я на самом деле написал это в jQuery: (убедитесь, что у вас есть правильный тег include)
var replaced = $("body").html().replace(/text/g,'replace');
$("body").html(replaced);
замена / изменение текста в DOM в этом масштабе не должна выполняться с тупой заменой HTML-regex, что очень небезопасно. Вы рискуете искалечить HTML в процессе.
что вам нужно сделать, это цикл над каждым TextNode (Node
) внутри документа, изменяя текст внутри них.
ваш код будет выглядеть примерно так:
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);
используйте DOM и измените data
соответствующего Text
узлы. Е. Г.
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;
});