Javascript 如何访问innerHTML但忽略<;脚本>;标签

Javascript 如何访问innerHTML但忽略<;脚本>;标签,javascript,html,Javascript,Html,我有一个插件,可以浏览HTML并替换文本。然而,在我当前的实现中,脚本中的文本标记也会在搜索中被捕获。这会导致受影响页面上的脚本损坏 var pageText = document.body.innerHTML; document.body.innerHTML = pageText.replace(regextgoeshere); 我尽了最大努力通过我的正则表达式模式过滤掉它,但我需要弄清楚如何跳过所有标记 获取innerHTML时有没有办法跳过所有标记?编辑:我误解了您的要求 如果您想要更复

我有一个插件,可以浏览HTML并替换文本。然而,在我当前的实现中,脚本中的文本标记也会在搜索中被捕获。这会导致受影响页面上的脚本损坏

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;
}