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

时间:2013-05-16 22:02:07

标签: javascript jquery html ajax jquery-events

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

10 个答案:

答案 0 :(得分:168)

对动态创建的元素使用事件委托:

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

这确实有效,这是一个例子,其中我添加了一个类.mylink而不是data - http://jsfiddle.net/EFjzG/

答案 1 :(得分:17)

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

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

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

关于这个问题的更多阅读:

答案 2 :(得分: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代码

答案 3 :(得分:2)

从jQuery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序。

示例 -

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

答案 4 :(得分:1)

对于那些仍在寻找解决方案的人来说,最好的方法是将事件绑定在文档本身上,而不是绑定事件&#34;准备就绪&#34; 例如:

$(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
        }
    });
});

});

答案 5 :(得分:0)

使用jQuery.live()代替。文档here

例如

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

答案 6 :(得分:0)

对于ASP.NET,请尝试:

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

这似乎适用于页面加载和更新面板加载

请查看完整的讨论here

答案 7 :(得分:0)

例如,如果您的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);
}

});

答案 8 :(得分:0)

Ajax 加载内容事件绑定的重要步骤...

01。首先解除绑定或关闭选择器上的事件

$(".SELECTOR").off();

02。在文档级别添加事件侦听器

$(document).on("EVENT", '.SELECTOR', function(event) { 
    console.log("Selector event occurred");
});

答案 9 :(得分:0)

<块引用>

这是我的首选方法:

// bind button click to function after button is AJAX loaded
$('#my_button_id').bind('click', function() {
    my_function(this);
});

function my_function () {
    // do stuff here on click
}

我在 AJAX 调用完成后立即放置此代码。