1

HTML がレンダリングされているときに、デバッグ テキストが DOM に挿入されるという状況に (少し制御不能に) 遭遇しました。テキストは次のようになります。

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

テキストは要素内ではなく、インラインでレンダリングされます。少なくとも adivまたは a内に配置されている場合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 のクラスレベルの実装を使用してみましたが、このテキストが実際に生成/レンダリングされている場所をトラップ/オーバーライドできるものは何もありません。

ここでのオプションは何ですか? 別の方法でそのテキストをスクラブできますか? そのスクリプト ブロックの実行を 2 回ブロックできますか? ASP.NET 要求パイプラインに、デモ テキストを実行できる他のオプションはありますか?

4

2 に答える 2

2
$("body").contents().filter( function(){
    return this.nodeType === 3 && /Version=\d\.\d\.\d\.\d/.test(this.nodeValue);
}).remove();

編集: テキストが body の直下にない可能性があるため、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" );
于 2012-05-30T14:41:03.110 に答える
1

@Pointyの提案に基づいた動作中のjsfiddleを次に示します。特定の詳細については、必要に応じて正規表現を調整してください。

//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();              
      }
  });
});​
于 2012-05-30T14:44:05.013 に答える