Reputation: 169
I am developing a chrome extension to replace specific texts on webpage. For some websites, it works only after refreshing webpages manually with F5. For example, when I open http://www.iciba.com/ and input Google and press Enter, all Google texts in results are not replaced. But after I press F5 to refresh page manually, all texts are replaced.
manifest.json:
{
"name": "My Extension",
"version": "0.1.0",
"description": "An extension that replaces texts on webpages",
"manifest_version": 2,
"permissions": [
"tabs",
"<all_urls>"
],
"content_scripts": [{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"replacetxt.js"
],
"run_at": "document_end",
"all_frames": true
}]
}
replacetxt.js:
function isExcluded(elm) {
if (elm.tagName == "STYLE") {
return true;
}
if (elm.tagName == "SCRIPT") {
return true;
}
if (elm.tagName == "NOSCRIPT") {
return true;
}
if (elm.tagName == "IFRAME") {
return true;
}
if (elm.tagName == "OBJECT") {
return true;
}
return false
}
function traverse(elm) {
if (elm.nodeType == Node.ELEMENT_NODE || elm.nodeType == Node.DOCUMENT_NODE) {
// exclude elements with invisible text nodes
if (isExcluded(elm)) {
return
}
for (var i=0; i < elm.childNodes.length; i++) {
// recursively call to traverse
traverse(elm.childNodes[i]);
}
}
if (elm.nodeType == Node.TEXT_NODE) {
// exclude text node consisting of only spaces
if (elm.nodeValue.trim() == "") {
return
}
// elm.nodeValue here is visible text we need.
console.log(elm.nodeValue);
elm.nodeValue = elm.nodeValue.replace("Google", "***");
}
}
traverse(document);
Here are working codes following @wOxxOm's advice
// Options for the observer (which mutations to observe)
const config = { attributes: true, childList: true, subtree: true };
// Callback function to execute when mutations are observed
const callback = function(mutationsList, observer) {
// Use traditional 'for loops' for IE 11
for(const mutation of mutationsList) {
traverse(mutation.target);
}
};
// Create an observer instance linked to the callback function
const observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(document, config);
Upvotes: 0
Views: 1351
Reputation: 169
// Options for the observer (which mutations to observe)
const config = { attributes: true, childList: true, subtree: true };
// Callback function to execute when mutations are observed
const callback = function(mutationsList, observer) {
// Use traditional 'for loops' for IE 11
for(const mutation of mutationsList) {
traverse(mutation.target);
}
};
// Create an observer instance linked to the callback function
const observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(document, config);
Upvotes: 1