3

検証コントロールを使用するときにボタンコントロールに追加されるASP.NETのJavaScriptonclickイベントハンドラーを置き換えようとしています。これは、このシナリオでASP.NETからHTMLに出力されるものです。

<input type="image" name="ibSubmit1" id="ibSubmit1" src="button-green-submit.gif" onclick="showProgress1();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ibSubmit1&quot;, &quot;&quot;, true, &quot;Group1&quot;, &quot;&quot;, false, false))" style="border-width:0px;" />

私はかなり熱心に見てきましたが、残念ながら、ページに挿入される前に関数サーバー側を変更する方法はないようです。

コントロールを開発していて、非侵襲的で自己完結型であることが望まれ、WebForm_PostBackOptionsオブジェクトのvalidationGroupパラメーターを取得することに関心があるため、JavaScriptを使用してWebForm_DoPostBackWithOptions関数名を次のように置き換えるのが最も簡単な解決策のようです。カスタムラッパー関数を使用して、残りのすべてのパラメーター情報をそのまま残します。次に、関心のある情報を抽出し、カスタム関数を呼び出してから、呼び出しをWebForm_DoPostBackWithOptionsに転送します。

注:私はjQueryを使用してカスタム関数を作成しているので、jQueryでこれを行う簡単な方法がある場合は、それを検討するオプションです。

onclickイベントハンドラーを置き換えようとしたコードは次のとおりです(機能していません)。

    $('[onclick*=WebForm_DoPostBackWithOptions]').each(function() {
        var txt = this.onclick;
        txt = txt + '';
        txt = txt.replace('WebForm_DoPostBackWithOptions','ml_DoPostBackWithOptions');
        this.onclick = eval(txt);
    });

alert()を使用して、テキストが正しく変更されていることを確認しましたが、eval()関数を使用するかどうかに関係なく、onclickハンドラーはJavaScriptとして認識しないようです。

正規表現を使用してvalidationGroup値を取得することを考えましたが、これを機能させることができれば、はるかにエレガントで柔軟になるようです...

注:コントロールがページに問い合わせる方法がある場合は、(ボタンの種類に関係なく)ポストバックするすべてのボタンを見つけて、サーバー側のプロパティを取得できるようにします。これも私が検討する何か。

4

3 に答える 3

5

HTML の解析時に属性値が関数にラップされるため、元の文字列を取得するのは困難です。関数の文字列表現を取得できますが、関数内のコードを解析する必要があります。

呼び出される関数を再定義しないのはなぜですか? これをページの最後に置きます:

<script type="text/javascript">

(function(){

  // keep the original
  var previous = WebForm_DoPostBackWithOptions;

  WebForm_DoPostBackWithOptions = function(options) {
    // do what you want with the options here
    // then call the original
    previous(options);
  }

})();

</script>
于 2010-08-25T11:31:19.707 に答える
0

通常、ASP.NETでは、ボタンに対してこれを無効にするには、次のようにします。

そして、これはクライアント側のonclickに渡され、falseが返されます。デフォルトの実装を防ぎます。それがサーバーからそれを行う方法です。クライアントから、onclickを完全に消去して、再実装する必要があります。

あなたがやろうとしていることを私が理解しているのか分かりません...なぜあなたはそれをこのようにやっているのですか?余分なデータを返すためにそれを行っていますか?もしそうなら、実装する他の方法があります...

于 2010-08-25T11:28:42.240 に答える
0

クリック イベントに機能を挿入するだけの場合は、jQuery の click() 関数を使用できます。クリック イベントの開始に関数呼び出しを追加し、既定の動作 (この場合はフォーム送信) を実行できるようにします。

 $(function() {
    $('[onclick*=WebForm_DoPostBackWithOptions]').click(function(event) {  

        //call your custom functions here and then do nothing, the 
        //default click event will still occur. If you don't want it to
        //propagate, call event.preventDefault();

        var txt = this.onclick;
        txt = txt + '';
        txt = txt.replace('WebForm_DoPostBackWithOptions','ml_DoPostBackWithOptions');
        setTimeout(txt,0);

        //event.preventDefault();  
        //or
        //event.stopPropagation();  
    });
 });

あなたが与えた例では、showProgress1();が2回呼び出されることに注意してください。

于 2010-08-25T11:50:04.690 に答える