Javascript 从DOM中删除不在元素中的文本

Javascript 从DOM中删除不在元素中的文本,javascript,jquery,asp.net-mvc,Javascript,Jquery,Asp.net Mvc,我遇到了一种情况(有点失控),在呈现HTML时,调试文本被插入到DOM中。文本如下所示: , NameSpace.ClassName, Version=x.x.x.x, Culture=neutral, PublicKeyToken=null var goodText = $('body').html(); goodText = goodText.replace(/, Plugin.[a-zA-Z0-9]*, Version=\d\.\d\.\d\.\d, Culture=neutral,

我遇到了一种情况(有点失控),在呈现HTML时,调试文本被插入到DOM中。文本如下所示:

, NameSpace.ClassName, Version=x.x.x.x, Culture=neutral, PublicKeyToken=null 
var goodText = $('body').html();
goodText = goodText.replace(/, Plugin.[a-zA-Z0-9]*, Version=\d\.\d\.\d\.\d, Culture=neutral, PublicKeyToken=null/g, '');
$('body').html(goodText);
文本只是内联呈现,而不是在元素中呈现。如果它至少被放在
div
span
中,我可以做些什么,但它只是
主体
中加载模块的一部分。因此,首先我尝试了以下方法:

, NameSpace.ClassName, Version=x.x.x.x, Culture=neutral, PublicKeyToken=null 
var goodText = $('body').html();
goodText = goodText.replace(/, Plugin.[a-zA-Z0-9]*, Version=\d\.\d\.\d\.\d, Culture=neutral, PublicKeyToken=null/g, '');
$('body').html(goodText);
虽然这将文本从混合中去除,但它将替换文档的整个
正文
,因此jQuery的documentready再次启动。我的其他剧本开始像北极的小美洲驼一样哭泣,而这一页开始分崩离析

页面的典型区块如下所示,由模块输出:

<div class="row">
  , NameSpace.ClassName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
  <div> some stuff</div>
  <script> $(function(){ // some script }); </script>
</div>

,NameSpace.ClassName,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null
一些东西
$(function(){//some script});
因此,即使我以
.row
为目标,将文本替换为上面的regex/string.replace并在元素上设置HTML,jQuery块也会再次执行。这显然是一大堆逃学的涂鸦

另外,我正在使用RazorGenerator加载模块,以在Asp.NETMVC4项目中构建DLL和BoC的预编译视图

我还尝试使用自定义ActionFilterAttribute的类级实现,但其中没有任何内容可以捕获/覆盖实际生成/呈现此文本的位置

我的选择是什么?我能用另一种方法把那篇文章擦掉吗?我可以再次阻止该脚本块的执行吗?在ASP.NET请求管道中是否有其他选项可以让我练习该恶魔文本

$("body").contents().filter( function(){
    return this.nodeType === 3 && /Version=\d\.\d\.\d\.\d/.test(this.nodeValue);
}).remove();
编辑:由于文本可能不在正文的正下方,我们需要遍历整个dom:

function walk( root ) {

    $( root ).contents().each( function() {

        if( this.nodeType === 1 && this.nodeName.toLowerCase() !== "iframe" ) {
            walk( this );
        }
        else if( this.nodeType === 3  && /Version=\d\.\d\.\d\.\d/.test(this.nodeValue)) {
            $(this).remove();
        }
    });
}

walk( "body" );
基于@Pointy的建议。根据需要调整您的正则表达式以获得特定的详细信息

//This is from http://stackoverflow.com/a/4399718/266795
var getTextNodesIn = function(el) {
    return $(el).find(":not(iframe)").andSelf().contents().filter(function() {
        return this.nodeType == 3;
    });
};

$(function () {
  getTextNodesIn("body").each(function (index, node) {
      if (/.*, NameSpace/.test(node.textContent)) {
         $(node).remove();              
      }
  });
});​

您可以查看
元素的子节点列表,并删除文本节点。同意,方法是选择文本节点,过滤到包含所述文本的节点,然后修改/删除它们。也就是说,如果您不能在服务器端将它们删除,那么可以。shade-可以,但我无法控制,这是第三方库所做的。我已经联系了作者,看看能做些什么,但他们的项目针对的是MVC3,而不是MVC4。在服务器端进行了一些绑定,直到我解决了这个问题。有时候,你需要一台推土机来完成铲子的工作。如果这很重要的话,这不会直接影响到你的身体。请参阅。@TimDown返回注释和文本节点的应该是
.children()
。你的意思是不会再深入了?OP说正文就在正文下面。啊,我搞错了。所以是的,它不会走得更深。我知道这比你拥有的更复杂。抱歉。@TimDown是的,我没有费心遍历整个dom,因为文本只是内联呈现,而不是在元素中呈现。如果它至少放在一个div或span中,我可以做点什么,但它只是主体的一部分,我将其解释为:文本节点,它们是主体的直接子节点。根据问题中的HTML片段,我认为您误读了问题的这一部分。看起来有问题的文本节点可能出现在类为“row”的
中。我认为OP意味着坏文本节点不在它们自己的特殊容器元素中(即只包含坏文本节点而不包含其他内容的元素)。不过我可能错了。谢谢你的帮助……我最终选择了“步行”解决方案,但这也是我要走的路。干杯