我想要做的是用JS书签或者creammonkey脚本中的'new'替换网页中'old'的所有实例。我怎样才能做到这一点?我认为jQuery或其他框架是可以的,因为有些黑客将它们包含在bookmarklet和greasemonkey脚本中。
答案 0 :(得分:26)
防止破坏的功能。这意味着这不会触及任何标签或属性,只会触及文本。
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].nodeType == Node.TEXT_NODE) {
var r = new RegExp(a, 'gi');
nodes[n].textContent = nodes[n].textContent.replace(r, b);
} else {
htmlreplace(a, b, nodes[n]);
}
}
}
htmlreplace('a', 'r');
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].nodeType==Node.TEXT_NODE){nodes[n].textContent=nodes[n].textContent.replace(new RegExp(a,'gi'),b);}else{htmlreplace(a,b,nodes[n]);}}}htmlreplace('old','new');
答案 1 :(得分:2)
如果您替换innerHtml,那么您将销毁页面上的任何dom事件。尝试遍历文档以替换文本:
function newTheOlds(node) {
node = node || document.body;
if(node.nodeType == 3) {
// Text node
node.nodeValue = node.nodeValue.split('old').join('new');
} else {
var nodes = node.childNodes;
if(nodes) {
var i = nodes.length;
while(i--) newTheOlds(nodes[i]);
}
}
}
newTheOlds();
如果您不需要模式匹配,则拆分/连接比执行“替换”更快。如果你需要模式匹配,那么使用“替换”和正则表达式:
node.nodeValue = node.nodeValue.replace(/(?:dog|cat)(s?)/, 'buffalo$1');
作为书签:
javascript:function newTheOlds(node){node=node||document.body;if(node.nodeType==3){node.nodeValue=node.nodeValue.split('old').join('new');}else{var nodes=node.childNodes;if(nodes){var i=nodes.length;while(i--)newTheOlds(nodes[i]);}}}newTheOlds();
答案 2 :(得分:1)
对于旧版浏览器,需要将Node.TEXT_NODE更改为3,将node.textContent更改为node.nodeValue;所以最后的功能应该是:
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].nodeType == 3) { //Node.TEXT_NODE == 3
var r = new RegExp(a, 'gi');
nodes[n].nodeValue = nodes[n].nodeValue.replace(r, b);
} else {
htmlreplace(a, b, nodes[n]);
}
}
}
答案 3 :(得分:0)
一个沿jQuery工作的简单行:
`javascript:var a = function(){$("body").html($("body").html().replace(/old/g,'new'));return;}; a();`
没有jQuery:
`javascript:function a (){document.body.innerHTML=document.body.innerHTML.replace(/old/g, "new" );return;}; a();`
返回任何内容的函数非常重要,因此在执行bookmarklet后浏览器不会被重定向到任何地方。
答案 4 :(得分:0)
又一种递归方法:
function replaceText(oldText, newText, node){
node = node || document.body;
var childs = node.childNodes, i = 0;
while(node = childs[i]){
if (node.nodeType == Node.TEXT_NODE){
node.textContent = node.textContent.replace(oldText, newText);
} else {
replaceText(oldText, newText, node);
}
i++;
}
}
缩小书签:
javascript:function replaceText(ot,nt,n){n=n||document.body;var cs=n.childNodes,i=0;while(n=cs[i]){if(n.nodeType==Node.TEXT_NODE){n.textContent=n.textContent.replace(ot,nt);}else{replaceText(ot,nt,n);};i++;}};replaceText('old','new');
答案 5 :(得分:0)
好吧,我只是在巩固人们在一个答案中提出的一些伟大的东西。
这是sixgear的jQuery代码,但是可移植(我从大G中获取jQuery)并缩小为bookmarklet:
javascript:var scrEl=document.createElement('script');scrEl.setAttribute('language','javascript');scrEl.setAttribute('type','text/javascript');scrEl.setAttribute('src','http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js');function htmlreplace(a,b,element){if(!element)element=document.body;var nodes=$(element).contents().each(function(){if(this.nodeType==Node.TEXT_NODE){var r=new RegExp(a,'gi');this.textContent=this.textContent.replace(r,b);}else{htmlreplace(a,b,this);}});}htmlreplace('old','new');
注意'old'可以是'string literal',也可以是'reg [Ee] x'。
实际上,现在我想起来了,sixgear是最好的答案,尤其是我的增强功能。我找不到其他答案添加的东西,使用jQuery实现了令人难以置信的X浏览器兼容性。另外,我太懒了。社区维基,享受!
答案 6 :(得分:-1)
嘿,你可以尝试这个,问题是它搜索整个身体,所以即使属性也会发生变化。
javascript:document.body.innerHTML=document.body.innerHTML.replace( /old/g, "new" );
答案 7 :(得分:-1)
我正在尝试稍微修改它,以便提示要搜索的文本,然后是要替换的文本,当完成所有处理后,会显示一个对话框,让我知道它已完成。
我计划在phpmyadmin数据库编辑页面上使用它,该页面将包含任意数量的文本框(,这是我需要它来搜索和替换)。此外,搜索和替换的文本可能是多行,也可能不是多行,所以我在正则表达式中添加了'm'参数,而且,因为我将进行可能包含html的搜索/替换,所以它们经常会有引号/双引号。例如:
搜索:
<img height="76" width="92" src="http://www.gifs.net/Animation11/Hobbies_and_Entertainment/Games_and_Gambling/Slot_machine.gif" /></div>
<div class="rtecenter"> <strong><em><font color="#ff0000">Vegas Baby!<br />
</font></em></strong></div>
并且可能没有替换(只是为了删除所有代码)或其他一些html。到目前为止,这是我提出的书签,( javascript,特别是bookmarklet不是我经常搞乱的东西)然而,它找不到任何东西,只要找到/替换,尽管它确实正确地进行提示。
javascript:var%20scrEl=document.createElement('script');scrEl.setAttribute('language','javascript');scrEl.setAttribute('type','text/javascript');scrEl.setAttribute('src','http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js');function%20htmlreplace(a,b,element){if(!element)element=document.body;var%20nodes=$(element).contents().each(function(){if(this.nodeType==Node.TEXT_NODE){var%20r=new%20RegExp(a,'gim');this.textContent=this.textContent.replace(r,b);}else{htmlreplace(a,b,this);alert('Done%20processing.');}});}htmlreplace(prompt('Text%20to%20find:',''),prompt('Replace%20with:',''));
有人有什么想法吗?