Javascript 如何访问innerHTML但忽略<;脚本>;标签
我有一个插件,可以浏览HTML并替换文本。然而,在我当前的实现中,脚本中的文本标记也会在搜索中被捕获。这会导致受影响页面上的脚本损坏Javascript 如何访问innerHTML但忽略<;脚本>;标签,javascript,html,Javascript,Html,我有一个插件,可以浏览HTML并替换文本。然而,在我当前的实现中,脚本中的文本标记也会在搜索中被捕获。这会导致受影响页面上的脚本损坏 var pageText = document.body.innerHTML; document.body.innerHTML = pageText.replace(regextgoeshere); 我尽了最大努力通过我的正则表达式模式过滤掉它,但我需要弄清楚如何跳过所有标记 获取innerHTML时有没有办法跳过所有标记?编辑:我误解了您的要求 如果您想要更复
var pageText = document.body.innerHTML;
document.body.innerHTML = pageText.replace(regextgoeshere);
我尽了最大努力通过我的正则表达式模式过滤掉它,但我需要弄清楚如何跳过所有标记
获取innerHTML时有没有办法跳过所有标记?编辑:我误解了您的要求 如果您想要更复杂的东西,请尝试Douglas Crockford的函数:
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
您可以使用节点的标记名属性跳过
元素:
if(node.tagName.toLowerCase() !== 'script'){
node.innerText = node.innerText.replace(regextgoeshere);
}
没有检查,但你可以试试
var pageText = document.body.innerHTML;
mypagewithoutScriptTag = pageText.replace(<script>(.*?)</script>);
var pageText=document.body.innerHTML;
mypagewithoutScriptTag=pageText.replace((.*);
也许你最好的选择是使用和否定不需要的元素。然后替换textContent而不是innerHTML。使用innerHTML可能会破坏文档标记
这是一个跨浏览器的解决方案
var matches = document.querySelectorAll("*:not(html):not(head):not(script):not(meta):not(link)");
console.log(matches);
[].forEach.call(matches, function(elem) {
var text = ('innerText' in elem) ? 'innerText' : 'textContent';
elem[text] = elem[text].replace("this", "works");
});
注1:HTML、HEAD、META和LINK标记不允许修改textContext
注2:innerText是IE专有的东西(也适用于chrome)。W3C将其定义为官方属性。我认为我们倾向于考虑元素和遗漏节点!
然而,这个问题最好通过思考节点来解决
澳大利亚人亚历克斯有最好的解决方案
Protip:innerText不会呈现HTML实体:玩得开心。@BjornTipling:.innerText
非标准,Firefox不支持。没关系,任何动态生成的文本节点都不会呈现HTML实体。您必须使用大量JavaScript来修复此问题。@b在我的第二个代码段中,对其进行处理仍然可以。textContent属性也可以使用,或者在执行替换之前可以使用nodeType
进行测试,但我不确定OP的确切要求是什么。谢谢你的意见!是的,我真的不明白这个问题是怎么回事,我只知道使用innerText或文本节点是一个充满问题的问题,最好避免,除非你在有限的容量中添加纯文本。谢谢你如此出色的回答。这将非常有效,因为它将是一个chrome插件
function myRecursiveSearch(node,.....) {
var excludeElements = ['script', 'style', 'iframe', 'canvas'];
var child = node.firstChild;
if(child==null)
return;
do {
switch (child.nodeType) {
case 1:
if (excludeElements.indexOf(child.tagName.toLowerCase()) > -1) {
continue;
}
myRecursiveSearch(child,.....);
break;
case 3:
child.nodeValue=doReolace(child.nodeValue,.....);
break;
}
} while (child = child.nextSibling);
}
function doTranslit(strtext,....) {
.....
return strtext;
}