jQuery单击不适用于ajax生成的内容


78

我在用 $(".button").on("click", function(){ });

单击到容器上的按钮,但随后进行了ajax调用,并且内容用新内容进行了更新,然后当我尝试.button单击该按钮时,它将无法工作...当我单击该按钮时,什么也不会返回。

我什至试过

$(".button").live("click", function(){ });

要么

$(".button").click(function(){ });

我该如何运作?

编辑: 我的HTML:

<div class="container">
   <ul>
       <li>item1</li>
       <li>item2</li>
       <li>item3</li>
   </ul>
   <input type="button" value="reload" class="button" />
</div>

1
请显示ajax调用返回的内容。
ron tornambe 2012年

其余的jQuery附加了侦听器。您所描述的正是live应该处理的内容,因此奇怪的是它没有用。
布兰登

我有一个ul,我在上面单击它们,然后用.on(“ click”)在javascript中回显“测试”,但是当我单击按钮时,它将执行ajax调用并重新加载ul,但是当我单击它时,它将停止执行任何操作单击按钮..它不会返回任何内容。
stergosz 2012年

Answers:


158

应该以这种方式完成。

$('body').on('click', '.button', function (){
        alert('click!');
    });

如果您的容器在ajax请求期间没有更改,则性能更高:

$('.container').on('click', '.button', function (){
        alert('click!');
    });

始终将委托事件绑定到将包含动态元素的最接近的静态元素。


感谢您的回答!仍然认为这很奇怪,使用这种方式感觉还不错。希望jquery有更好的方式来处理此类情况
Miguel Stevens 2014年

1
@MiguelStevens,阅读并理解了该概念后,请继续阅读文档,它不会很奇怪,而且会很有意义。
gdoron支持Monica 2014年

但我怎么会写这个父... $(“#输入someId”)自动完成({//一些代码}); ... ...有没有在事件在这里..

1
@Sadaquat,我建议在不同的线程中写一个包含所有必需细节的完整问题。如果您找不到答案,可以给我发个评论ping我,我会尽力提供帮助。
gdoron支持Monica 2015年

1
终于,我找到了想要的解决方案!谢谢您,先生
KP

40

好的,因为我缺少一个参数,所以可以通过正确使用.on()函数解决我的问题。

代替

$(".button").on("click", function() { } );

我用了

$(".container").on("click", ".button", function() { } );

1
请注意,选择器参数不是必需的,但在这种情况下是必需的。
贾里德·法瑞希

感谢您的解决方案,+ 1
Aldry Wijaya

为什么选择器参数不是必需的,但在这种情况下是必需的?
ryentzer

我认为这是因为在这种情况下选择器会重新运行,但是如果不包含选择器,则不会在选择器抓取的项目的原始运行列表中捕获该选择器。
Bing

8

代替:

$(".button").on("click", function() { } );

我用了:

$(".container").on("click", ".button", function() { } );

我已经用过了,而且有效。


3

这是您要做什么?请注意,我将$.on()放在父项上,但.button为操作选择。

.on(事件[,选择器] [,数据],handler(eventObject))

选择器一个选择器字符串,用于过滤触发事件的所选元素的后代。如果选择器为null或省略,则事件在到达选定元素时始终被触发。

http://api.jquery.com/on/

<div id="stuff">
    <button class="button">Click me!</button>
    <p>Stuff</p>
</div>

var $stuff = $('#stuff'),
    ajaxContent = $stuff.html();

$stuff.on('click', '.button', function(){
    $.get('/echo/html/', function(){
        $stuff.empty();
        console.log($stuff.html());
        alert($stuff.html()); // Look behind, #stuff is empty.
        $stuff.html(ajaxContent);
        console.log($stuff.html());
    });
});

http://jsfiddle.net/62uSU/1

另一个示范:

var $stuff = $('#stuff'),
    ajaxContent = $stuff.html(),
    $ajaxContent,
    colors = ['blue','green','red'],
    color = 0;

$stuff.on('click', '.button', function(){
    $.get('/echo/html/', function(){
        color++;
        if (color == colors.length) color = 0;
        console.log($stuff.html());
        alert($stuff.html());
        $ajaxContent = $(ajaxContent);
        $stuff.append($ajaxContent).css('color', colors[color]);
        console.log($stuff.html());
    });
});

http://jsfiddle.net/62uSU/2/

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.