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

时间:2012-05-30 14:22:25

标签: javascript jquery asp.net-mvc

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

, NameSpace.ClassName, Version=x.x.x.x, Culture=neutral, PublicKeyToken=null 

文本只是内联呈现,而不是元素。如果它至少放在divspan内,我可以对它做些什么,但它只是加载模块的body的一部分。所以首先我尝试了以下内容:

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

虽然这会将文本从混合中删除,但它正在替换文档的整个body,因此jQuery的文档准备就绪了。我的其他剧本开始像北极的小骆驼一样哭泣,页面崩溃了。

页面的典型块看起来像这样,作为模块的输出:

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

所以,即使我定位.row,用上面的regex / string.replace替换文本并在元素上设置HTML,jQuery块也会再次执行。明显地说,这是一大堆俗人的涂鸦。

作为一方,我正在使用RazorGenerator加载模块,以在Asp.Net MVC4项目中构建DLL和BoC的预编译视图。

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

我有什么选择?我可以用其他方式擦除文本吗?我可以第二次阻止该脚本块的执行吗?我是否在ASP.NET请求管道中有任何其他选项可以让我练习该恶魔文本?

2 个答案:

答案 0 :(得分:2)

$("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" );

答案 1 :(得分:1)

Here's a working jsfiddle基于@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();              
      }
  });
});​