AJAXで読み込まれたコンテンツをHTMLページのmyLink
(appendedContainer)に挿入するリンクdiv
があります。問題は、jQueryにバインドしたclick
イベントが、appendedContainerに挿入された新しくロードされたコンテンツで実行されていないことです。 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>
動的に作成された要素にイベント委任を使用します。
$(document).on("click", '.mylink', function(event) {
alert("new link clicked!");
});
これは実際に機能します。ここでは、data
の代わりにクラス.mylink
をアンカーに追加した例を示します--http://jsfiddle.net/ EFjzG /
.on()が呼び出された後にコンテンツが追加される場合、ロードされたコンテンツの親要素に委任されたイベントを作成する必要があります。これは、.on()が呼び出されたときにイベントハンドラーがバインドされるためです(つまり、通常はページの読み込み時に)。 .on()が呼び出されたときに要素が存在しない場合、イベントはそれにバインドされません!
イベントはDOMを介して伝播するため、ページの読み込み時に存在することがわかっている親要素(下の例では.parent-element
)で委任されたイベントを作成することでこれを解決できます。方法は次のとおりです。
$('.parent-element').on('click', '.mylink', function(){
alert ("new link clicked!");
})
主題に関するいくつかのさらなる読書:
あなたの質問が「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コードごとに構成を配置する必要はありません。
JQuery 1.7以降、.live()
メソッドは非推奨になりました。 .on()
を使用して、イベントハンドラーをアタッチします。
例-
$( document ).on( events, selector, data, handler );
まだ解決策を探している人にとって、それを行う最善の方法は、ドキュメント自体にイベントをバインドすることであり、「準備完了」のイベントにバインドしないことです。
$(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
}
});
});
});
ASP.NETの場合、これを試してください。
<script type="text/javascript">
Sys.Application.add_load(function() { ... });
</script>
これは、ページの読み込みと更新パネルの読み込みで機能するようです
完全な議論を見つけてください こちら 。
たとえば、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);
}
});
代わりにjQuery.live()を使用してください。ドキュメント ここ
例えば
$("mylink").live("click", function(event) { alert("new link clicked!");});