如何在Ajax加载的内容上绑定事件?


96

我有一个链接,该链接myLink应该将AJAX加载的内容插入到divHTML页面的(appendContainer)中。问题是click我绑定到jQuery 的事件没有在插入到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>

1
注意:以下内容不起作用。您缺少.类选择器。
不确定

这是一个错字!它仍然无法正常工作。
提交

1
请参见jquery .load()方法。$('#target')。load('source.html');
km6zla

load()有什么不同之处吗?
恭喜

Answers:


218

将事件委托用于动态创建的元素:

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

这不实际工作,这里就是我附加了该类锚的例子.mylink,而不是data- http://jsfiddle.net/EFjzG/


这就是我写的。
提交

@confile真的吗?我已经读过两次您的问题,无论是书面还是代码都看不到?
dsgriffin

@confile ..看到答案agian ..与您的答案不同
Mohammad Adil

2
@confile我的答案确实有用!这是一个示例-jsfiddle.net/EFjzG
dsgriffin

1
嗨,这个答案很好用。事件附加在整个文档上,因此基本上页面上的每次单击都是触发事件,但是随后,选择器'.mylink'被应用于过滤我们需要的单击事件。优秀的技术。
埃米尔(Emir)2014年

23

如果在调用.on()之后附加内容,则需要在已加载内容的父元素上创建一个委托事件。这是因为在调用.on()时(即通常在页面加载时)绑定了事件处理程序。如果在调用.on()时该元素不存在,则该事件将不会绑定到该元素!

因为事件是通过DOM传播的,所以我们可以通过.parent-element在页面加载时知道存在的父元素(在下面的示例中)上创建委托事件来解决此问题。这是如何做:

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

有关此主题的更多阅读内容:


3
我更喜欢@lifetimes的答案,因为它告诉我将处理程序设置为加载时出现的某个父元素,而不必一直到document为止。这使得第二个参数中的选择器on不太可能发生意外匹配。
R. Schreurs '18

如果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

对于仍在寻找解决方案的人,最好的解决方案是将事件绑定到文档本身,而不是与事件“准备就绪”绑定。例如:

$(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.