【问题标题】:jQuery click function doesn't work after ajax call? [duplicate]ajax调用后jQuery点击功能不起作用? [复制]
【发布时间】:2013-07-16 22:05:05
【问题描述】:

jQuery click 函数在这里可以正常工作

<div id="LangTable"><a class="deletelanguage">delete</a></div>    

$('.deletelanguage').click(function(){
    alert("success");
});

但如果我通过 ajax 设置一些 &lt;a&gt;$('.deletelanguage').click 将不起作用。

例如

function CreateRow(jdata) { 
    $('#LangTable').append('<a class="deletelanguage">delete</a>');
}

$.ajax({        
    url: "/jobseeker/profile/",
    success: CreateRow
});

现在最后一个&lt;a&gt;$('.deletelanguage').click 不起作用。

jsfiddle 示例:http://jsfiddle.net/suhailvs/wjqjq/

注意:CSS 在这里可以正常工作。

我想让这些新添加的 &lt;a&gt; 与 jQuery click 一起使用。

【问题讨论】:

    标签: html ajax jquery dom


    【解决方案1】:

    问题在于 .click 仅适用于页面上已有的元素。 如果要连接未来的元素,则必须使用 on 之类的东西

    $("#LangTable").on("click",".deletelanguage", function(){
      alert("success");
    });
    

    【讨论】:

    • 我也遇到了这个问题,您必须确保在第一个 $('#here') 中使用父 ID 或类,然后在“单击”之后使用按钮的实际类, .感谢我们的回答,
    • 就像@rafaelmsantos 所说的那样,你必须去上一个不会动态添加的父 ID/类
    • 另外值得一提的是,父元素不应该是 AJAX 调用的一部分。换句话说,父级不应该由 AJAX 调用生成。
    【解决方案2】:

    当您使用$('.deletelanguage').click() 注册事件处理程序时,它只会将处理程序添加到执行代码时存在于 dom 中的那些元素

    您需要在此处使用基于委托的事件处理程序

    $(document).on('click', '.deletelanguage', function(){
        alert("success");
    });
    

    【讨论】:

    • 感谢它使用 $(document) 而不是元素本身,然后在 .on() 参数中声明元素!
    【解决方案3】:
    $('body').delegate('.deletelanguage','click',function(){
        alert("success");
    });
    

    $('body').on('click','.deletelanguage',function(){
        alert("success");
    });
    

    【讨论】:

      【解决方案4】:

      由于类是动态添加的,所以需要使用event delegation来注册事件处理函数,如:

      $('#LangTable').on('click', '.deletelanguage', function(event) {
          event.preventDefault();
          alert("success");
      });
      

      这会将您的事件附加到 #LangTable 元素中的任何锚点, 减少检查整个 document 元素树的范围并提高效率。

      FIDDLE DEMO

      【讨论】:

      • 感谢您的回答。但我想要默认的a href
      • 好的,那么event.preventDefault() 就不需要了!
      【解决方案5】:

      这是FIDDLE

      与您的代码相同,但它适用于动态创建的元素。

      $(document).on('click', '.deletelanguage', function () {
          alert("success");
          $('#LangTable').append(' <br>------------<br> <a class="deletelanguage">Now my class is deletelanguage. click me to test it is not working.</a>');
      });
      

      【讨论】:

        【解决方案6】:

        点击事件在定义事件的那一点不存在。您可以使用直播或委托活动。

        $('.deletelanguage').live('click',function(){
            alert("success");
            $('#LangTable').append(' <br>------------<br> <a class="deletelanguage">Now my class is deletelanguage. click me to test it is not working.</a>');
        });
        

        【讨论】:

        • 这已被弃用,不应使用。从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用 .on() 附加事件处理程序。旧版本 jQuery 的用户应该使用 .delegate() 而不是 .live()。
        • 当然,但有时当坚持使用旧版本的 jQuery 时,live() 是唯一有效的方法,即使对 delegate() 也是如此。
        【解决方案7】:

        我测试了一个适合我的简单解决方案! 我的 javascript 在一个 js 单独的文件中。我所做的是我将新元素的 javascript 放入加载了 ajax 的 html 中,它对我来说很好用! 这适用于那些拥有大文件 javascript 的人!

        【讨论】:

        • 我遇到了同样的问题,奇怪的是,在 ajax 加载的 html 的末尾插入 .js,可以!
        • 这不好,那么每次重新加载组件时,随着 js 从 ajax 加载的内容中移出,您最终都会得到重复的 js!当心这个解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多