1

ユーザーがリンクをクリックすると、リンクが実行$.postされてデータが取得され、表示されます。リンクの 1 つは、各セッションの横にあるボタンでセッションの表を引き出します。ボタンの 1 つのコードは次のとおりです。

<button class="view_session btn btn-info" id="3f87d50493698d06b9b48abe36cd8fc8">Details</button>

そして、ここに私のjQuery関数があります:

$('.view_session').click(function(){
    $('#blanket').show();
    $('#load').show();
    $.post("admin/session.php", { id: $(this).attr('id') }, function(data){
        $('#sort').html(data);
        $('#first').hide();
        $('#load').hide();
        $('#blanket').hide();
    }); 
});

しかし、何も起こりません。テストするために入れましたConsole.logが、何もトリガーされませんでした。ページが最初に読み込まれた後にボタンが作成されているため、私がしなければならないことはありますか?

4

2 に答える 2

4

ボタンを動的に追加する場合、.click既に存在しない限り、 はそれにバインドしません。ボタンが DOM に追加されたにバインドするか、次のように委任を使用する必要があります。

$(document).on('click', '.view_session', function () {

(より具体的なセレクターdocumentがいいでしょう)。

それ以外では、関数としての 3 番目の引数は、$.post成功した場合にのみ発生します。遅延インターフェイス メソッドを使用して、失敗と完了を確認することもできます。

$.post(...).then(success).fail(failure).done(complete);
于 2012-12-14T14:50:57.090 に答える
1

ページが最初に読み込まれた後にボタンが作成されているため、私がしなければならないことはありますか?

はい。

これは、ハンドラーが jQuery オブジェクトで現在選択されている要素に関連付けられているためです。そのため、これらの要素はバインディングが発生する時点で存在している必要があります。

解決策は、追加された要素にイベントを手動で再バインドするか、委任を使用してイベントをバインドする必要があることです。

jQuery 1.7 以降on()で委譲を使用する場合:

$("#YourclosestStaticElement").on("click", ".view_session", function () {
   //... same code as before
}

jQuery 1.4.3 から 1.6 までの場合delegate():

$("#YourclosestStaticElement").delegate(".view_session", "click", function () {
   //... same code as before
}

jQuery 1.3live()の場合、手動で再バインドする以外に、1.4.3 まで/1.4.3 を含む方法が唯一の方法です。

$(".view_session").live("click", function () {
   //... same code as before
}

live()さらに、イベントをトリガーする前に常にドキュメントにバブルアップするという事実の中で、非推奨になった理由はたくさんありstopPropogation()ます。たとえば、意味が問題になる可能性があります。

理由の全リストもlive()ドキュメントにあります。

ドキュメントから引用するには:

  • $(selector).live(イベント、データ、ハンドラー); // jQuery 1.3+
  • $(document).delegate(セレクター、イベント、データ、ハンドラー); // jQuery 1.4.3+
  • $(document).on(イベント、セレクター、データ、ハンドラー); // jQuery 1.7+
于 2012-12-14T15:05:56.387 に答える