Ajaxで読み込まれたコンテンツにイベントをバインドする方法は?


96

HTMLページの(appendedContainer)にmyLinkAJAXロードされたコンテンツを挿入するリンクがありdivます。問題は、clickjQueryにバインドしたイベントが、appliedContainerに挿入された新しくロードされたコンテンツで実行されないことです。clickイベントは、私のAJAX機能がロードされていないDOM要素にバインドされています。

イベントがバインドされるように、何を変更する必要がありますか?

私のHTML:

<a class="LoadFromAjax" href="someurl">Load Ajax</a>
<div class="appendedContainer"></div>

私のJavaScript:

$(".LoadFromAjax").on("click", function(event) {
    event.preventDefault();
    var url = $(this).attr("href"),
        appendedContainer = $(".appendedContainer");

    $.ajax({
    url: url,
    type : 'get',
    complete : function( qXHR, textStatus ) {           
        if (textStatus === 'success') {
            var data = qXHR.responseText
            appendedContainer.hide();
            appendedContainer.append(data);
            appendedContainer.fadeIn();
        }
      }
    });

});

$(".mylink").on("click", function(event) { alert("new link clicked!");});

ロードするコンテンツ:

<div>some content</div>
<a class="mylink" href="otherurl">Link</a>

1
注:以下は機能しません。.クラスセレクターがありません。
未定義

これはタイプミスでした!それはまだ機能していません。
confile

1
jquery .load()メソッドを参照してください。$( '#target')。load( 'source.html');
km6zla 2013年

load()は何か違うことをしますか?
confile

回答:


218

動的に作成された要素にイベントの委任を使用します。

$(document).on("click", '.mylink', function(event) { 
    alert("new link clicked!");
});

これは、実際の仕事は、ここで私はクラスでアンカーを追加例だん.mylinkの代わりにdata- http://jsfiddle.net/EFjzG/


これは私が書いたものです。
confile

@confileほんと?私はあなたの質問を2回読みましたが、書面でもコードでも見ていませんか?
dsgriffin 2013年

@confile ..回答を参照してくださいアジャン..それはあなたが持っているものとは異なります
Mohammad Adil

2
@confile私の答えはうまくいきます!! これがその例です-jsfiddle.net/EFjzG
dsgriffin

1
こんにちは、この答えはうまくいきます。イベントはドキュメント全体に添付されるため、基本的にはページ上のすべてのクリックがイベントをトリガーしますが、セレクター '.mylink'を適用して必要なクリックイベントをフィルター処理します。優れたテクニック。
Emir

23

.on()が呼び出された後にコンテンツが追加される場合は、ロードされたコンテンツの親要素で委任されたイベントを作成する必要があります。これは、.on()が呼び出されたときにイベントハンドラーがバインドされるためです(つまり、通常はページの読み込み時)。.on()が呼び出されたときに要素が存在しない場合、イベントはそれにバインドされません!

イベントはDOMを介して伝播するため.parent-element、ページの読み込み時に存在することがわかっている親要素(下の例)に委任イベントを作成することで、これを解決できます。方法は次のとおりです。

$('.parent-element').on('click', '.mylink', function(){
  alert ("new link clicked!");
})

主題についてもう少し読んでください:


3
@lifetimesによる回答よりもこの回答をお勧めします。ロード時に存在する親要素にハンドラーを設定する必要があるためです。これにより、2番目の引数のセレクターがon意図しない一致になりにくくなります。
R. Schreurs

ajaxで読み込まれたhtmlクラスも親要素である場合、機能しません
jafar pinjar

6

あなたの質問が「ajaxロードされたコンテンツでイベントをバインドする方法」である場合は、次のようにすることができます。

$("img.lazy").lazyload({
    effect : "fadeIn",
    event: "scrollstop",
    skip_invisible : true
}).removeClass('lazy');

// lazy load to DOMNodeInserted event
$(document).bind('DOMNodeInserted', function(e) {
    $("img.lazy").lazyload({
        effect : "fadeIn",
        event: "scrollstop",
        skip_invisible : true
    }).removeClass('lazy');
});

そのため、すべてのajaxコードに構成を配置する必要はありません。


2

jQuery 1.7以降、この.live()メソッドは非推奨になりました。.on()イベントハンドラーをアタッチするために使用します。

例-

$( document ).on( events, selector, data, handler );

1

まだ解決策を探している人にとって、それを行う最善の方法は、ドキュメント自体にイベントをバインドすることであり、「on ready」のイベントにバインドしないことです。

$(function ajaxform_reload() {
$(document).on("submit", ".ajax_forms", function (e) {
    e.preventDefault();
    var url = $(this).attr('action');
    $.ajax({
        type: 'post',
        url: url,
        data: $(this).serialize(),
        success: function (data) {
            // DO WHAT YOU WANT WITH THE RESPONSE
        }
    });
});

});


1

たとえば、ajax応答にhtmlフォーム入力が含まれている場合、これは素晴らしいことです。

$(document).on("change", 'input[type=radio][name=fieldLoadedFromAjax]', function(event) { 
if (this.value == 'Yes') {
  // do something here
} else if (this.value == 'No') {
  // do something else here.
} else {
   console.log('The new input field from an ajax response has this value: '+ this.value);
}

});

0

代わりにjQuery.live()を使用してください。ドキュメントはこちら

例えば

$("mylink").live("click", function(event) { alert("new link clicked!");});

9
.live()は廃止され、最新のjqueryバージョンで削除されました。
Mohammad Adil 2013年

0

ASP.NETの場合、これを試してください。

<script type="text/javascript">
    Sys.Application.add_load(function() { ... });
</script>

これはページの読み込みと更新パネルの読み込みで機能するようです

ここで完全な議論を見つけてください。


2
この「Sys.Application」はどこから来たのですか?- 」
アンドレ・Marcondesテイシェイラ

ASP.NETに属するように表示されます。msdn.microsoft.com/en-us/library/vstudio/...
マイケル・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.