我遇到了一种情况(有点失控),在呈现HTML时,调试文本会被插入到我的DOM中。该文字如下所示:
, NameSpace.ClassName, Version=x.x.x.x, Culture=neutral, PublicKeyToken=null
文本只是内联呈现,而不是元素。如果它至少放在div
或span
内,我可以对它做些什么,但它只是加载模块的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请求管道中有任何其他选项可以让我练习该恶魔文本?
答案 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();
}
});
});