I\'m trying to slightly modify this so that it prompts for the text to search for, followed by the text to replace with, and when all done processing, show a dialog box lett
This worked for me:
javascript:function%20htmlreplace(a,b,element){if(!element)element=document.body;var%20nodes=element.childNodes;for(var%20n=0;n<nodes.length;n++){if(nodes[n].nodeType==Node.TEXT_NODE){nodes[n].textContent=nodes[n].textContent.replace(new%20RegExp(a,'gi'),b);}else{htmlreplace(a,b,nodes[n]);}}}htmlreplace(prompt("Text%20to%20replace:","old"),prompt("Replacement%20text:","new"));
All I did was replace the old
and new
with a prompt()
function. good bookmarklet.
Here is the most direct conversion of the original function to search/replace textarea and text inputs instead of HTML. I also added 'm' to regex and added alert('done') at end. However, I think that using 'm' may not solve your problem perfectly, but I may be wrong.
function htmlreplace(a, b, element) {
if (!element) element = document.body;
var nodes = element.childNodes;
for (var n=0; n<nodes.length; n++) {
if ( nodes[n].type && (nodes[n].type.toLowerCase() == 'textarea' || nodes[n].type.toLowerCase() == 'text') ) {
var r = new RegExp(a, 'gim');
nodes[n].value = nodes[n].value.replace(r, b);
} else {
htmlreplace(a, b, nodes[n]);
}
}
}
htmlreplace(prompt('find'), prompt('replace'));
alert('done');
Here it is as a bookmarklet.
javascript:function htmlreplace(a,b,element){if(!element)element=document.body;var nodes=element.childNodes;for(var n=0;n<nodes.length;n++){if(nodes[n].type&&(nodes[n].type.toLowerCase()=='textarea'||nodes[n].type.toLowerCase()=='text')){var r=new RegExp(a,'gim');nodes[n].value=nodes[n].value.replace(r,b)}else{htmlreplace(a,b,nodes[n])}}}htmlreplace(prompt('find'),prompt('replace'));alert('done');
A search landed me here, and the stuff above is wrong (or at least outdated), and I went through the trouble of updating it until it worked, so I figured I'd paste it here:
javascript:var count=0;
function htmlreplace(a,b,element){
if(!element)element=document.body;
var nodes=element.childNodes;
for(var n=0;n<nodes.length;n++){
if(nodes[n].type&&nodes[n].type.toLowerCase()=='textarea'){
var r=new RegExp(a,'gim');
if(nodes[n].value.match(r)){
count++;
}
nodes[n].value=nodes[n].value.replace(r,b)
}
else if(nodes[n].nodeValue && nodes[n].nodeValue.length > 0){
var r=new RegExp(a,'gim');
if(nodes[n].nodeValue.match(r)){
count++;
}
nodes[n].nodeValue=nodes[n].nodeValue.replace(r,b)
}
else{
htmlreplace(a,b,nodes[n])
}
}
}
htmlreplace(prompt('find'),prompt('replace'));
alert('replaced '+count+' words.');
(Tested in Chrome) It's got a word count instead of just a 'done' message. I changed it to scan through all textNode elements. (I suppose MOST people wouldn't care about replacing all text on the page, but that's the use case that brought me here.)