2011-09-27 75 views
1

我想从加载后使用javascript的html页面中删除文本,“嗨妈妈”。JavaScript删除文本

我不能使用像jQuery这样的任何框架。

我可以使用DOM,但不知道它在哪里,除了它被包裹在某处的标签中。

这可以在普通的旧Javascript中完成吗?

回答

2

这是一个非常简单的DOM操作,你可以做。

如果您认为同一个文本节点中可能会出现多次,可能会有所改进,但听起来并不是这种情况。

DEMO:http://jsfiddle.net/UrNWb/

var text_to_remove = "Hi Mom"; 

function dom_walk(el) { 
    if(el.nodeType === 1 && el.childNodes.length) { 
     if(el.nodeName.toLowerCase() !== 'script') { 
      for(var i = 0; i < el.childNodes.length; i++) { 
       dom_walk(el.childNodes[ i ]); 
      } 
     } 
    } else if(el.nodeType === 3) { 
     if(el.data.indexOf(text_to_remove) !== -1) { 
      el.data = el.data.replace(text_to_remove, ''); 
     } 
    } 
} 

dom_walk(document.body); 
+0

酷,但indexOf测试看起来多余,为什么不只是做替换(并保存一行代码)。也不理解el.childNodes.length的测试,如果它为零,for循环将被忽略。 – RobG

+0

@RobG:我想到'indexOf'比'.replace()'+重新分配更快的操作。而'.length',我只是想尽可能地避免'if'中的额外工作,比如'toLowerCase()',但是你是对的,它可以被消除。 – user113716

+0

...但是后来我想在脚本的情况下,'.length'不可能是'0',所以真的没有意义。编辑:其实,我只是做了一个测试,至少在Chrome中,我得到'

-1

document.body.innerHTML = document.body.innerHTML.replace("Hi Mom", "")应该是一个体面的开始。

+1

销毁和恢复整个DOM结构并不是一个好习惯。 – user113716

+1

您只是销毁了非内联文档中的每个侦听器,并且可能会一路销毁相当多的属性和默认属性。 – RobG

1

最简单的办法:

function removeText(s) { 
    var el, els = document.getElementsByTagName('*'); 
    var node, nodes; 

    for (var i=0, iLen=els.length; i<iLen; i++) { 
    el = els[i]; 

    if (el.tagName.toLowerCase() != 'script') { 
     nodes = el.childNodes; 
    } else { 
     nodes = []; 
    } 

    for (var j=0, jLen=nodes.length; j<jLen; j++) { 
     node = nodes[j]; 

     if (node.nodeType == 3) { 
     node.data = node.data.replace(s, ''); 
     } 
    } 
    } 
} 

window.onload = function() { 
    removeText('hi mom'); 
} 

你也可以做一个递归版本,但上述只是简单。