80

私のページにはいくつかの入力要素とオプション要素があり、それぞれ (ほぼ) 変更されたページ上のテキストを更新するためのイベントが関連付けられています。私は本当にクールなjQueryを使用しています:)

また、UpdatePanel を利用して、MicrosoftのAjaxフレームワークも使用しています。これを行う理由は、特定の要素がサーバー側のロジックに基づいてページ上に作成されるためです。UpdatePanel を使用する理由を説明したくありません。jQueryのみを使用するように書き直すことができたとしても (かなりの労力を要します)、それでも UpdatePanel が必要です。

ご想像のとおり、UpdatePanel にポストバックすると、jQuery イベントが機能しなくなります。「ポストバック」は実際には新しいポストバックではないため、イベントをバインドする document.ready のコードが再度発生することはないため、実際にはこれを期待していました。また、jQuery ヘルプ ライブラリで調べて、私の疑いを確認しました。

とにかく、 UpdatePanel がDOMの更新を完了した後、コントロールを再バインドするという問題が残っています。ページに .js ファイル (jQuery プラグイン) を追加する必要がないソリューションが必要ですが、メソッドを呼び出してすべてのフォーム要素を再バインドできる UpdatePanel の「更新後」をキャッチできるような単純なものが必要です。 .

4

9 に答える 9

86

pageLoadASP.NET AJAX を使用しているため、UpdatePanel から完全または部分的にページがポストバックされるたびに呼び出されるイベント ハンドラーにアクセスできます。関数をページに配置するだけでよく、接続する必要はありません。

function pageLoad(sender, args)
{
   if (args.get_isPartialLoad())
   {
       //Specific code for partial postbacks can go in here.
   }
}
于 2008-11-19T10:33:19.760 に答える
23

on()または、メソッドを介して最新のjQueryのライブ機能を確認することもできます。

于 2009-02-13T19:19:38.310 に答える
22
Sys.Application.add_load(initSomething);
function initSomething()
{
  // will execute on load plus on every UpdatePanel postback
}
于 2008-11-20T08:32:40.347 に答える
14

jQuery 1.7以降、これを行うための推奨される方法は、jQueryの.on()構文を使用することです。

ただし、 DOMオブジェクト自体ではなく、ドキュメントオブジェクトにイベントを設定するようにしてください。たとえば、これはUpdatePanelポストバックの後で壊れます:

$(':input').on('change', function() {...});

...':inputs'が書き直されたため。代わりにこれを行ってください:

$(document).on('change', ':input', function() {...});

ドキュメントが存在する限り、入力(UpdatePanelの更新からの入力を含む)は変更ハンドラーをトリガーします。

于 2012-08-01T17:21:00.577 に答える
9

次のコードを使用します

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoaded);

function pageLoaded(sender, args) {
    var updatedPanels = args.get_panelsUpdated();
    // check if Main Panel was updated 
    for (idx = 0; idx < updatedPanels.length; idx++) {
        if (updatedPanels[idx].id == "<%=upMain.ID %>") {
            rebindEventsForMainPanel();
            break;
        }
    }
}
于 2009-07-29T10:05:56.883 に答える
8

jQuery とイベント委任を使用できます。基本的に、すべての要素ではなくコンテナにイベントをフックし、event.target をクエリして、それに基づいてスクリプトを実行します。

コード ノイズを減らすという点で複数の利点があります (再バインドする必要はありません)。また、ブラウザのメモリも使いやすくなります (DOM にバインドされるイベントが少なくなります)。

ここに簡単な例があります。

簡単なイベント委任のためのjQuery プラグイン。

PS 次のリリースで委譲が jQuery コアに組み込まれることは 99% 確信しています。

于 2008-11-19T10:54:48.440 に答える
5

次のコードを使用します。コントロールがデータピッカーを使用することを検証する必要があります。

    <script type="text/javascript" language="javascript">

         Sys.WebForms.PageRequestManager.getInstance().add_endRequest(addDataPicker); 
         function addDataPicker(sender, args)
         {
            var fchFacturacion = document.getElementById('<%= txtFechaFacturacion.ClientID %>');
            if (fchFacturacion != null) {
               $(fchFacturacion).datepicker({ onSelect: function () { }, changeMonth: true, changeYear: true, showOn: 'button', buttonImage: '../Imagenes/calendar.gif', buttonImageOnly: true});}
         } 

    </script>

     <asp:UpdatePanel ID="upEjem" runat="server" UpdateMode="Conditional">
       <ContentTemplate>
              <div id="div1" runat="server" visible="false">
                  <input type="text" id="txtFechaFacturacion" 
                      name="txtFechaFacturacion" visible="true"
                      readonly="readonly" runat="server" />
              </div>
       </ContentTemplate>
     </asp:UpdatePanel>
于 2010-11-04T16:21:02.987 に答える
4

         <script type="text/javascript">
             function pageLoad() {

                 if (Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {


       }

            </script>

        </ContentTemplate>
    </asp:UpdatePanel>

「if」の中に、updatepanel が AsyncPostBack を実行するたびに実行する必要があるコードを入れることができます。

于 2010-01-12T14:46:23.693 に答える
2

jQuery の新しい「ライブ」メソッドを使用してイベントをバインドします。イベントを現在のすべての要素と将来のすべての要素にバインドします。チャチン!:)

于 2010-03-12T19:33:13.623 に答える