2013-02-21 75 views
-1

我遇到了使用ajax生成的选择器的问题。无法选择jQuery ajax返回元素

基本上我有一个默认状态的开始按钮。 onclick,它启动一些东西,然后点击也会带来一个带有结果的ajax调用的新div。其中一个项目是停止按钮。 从主网页我的链接的脚本有附加到此停止按钮

<a id="stop">stop</a> 

如果我把剧本在线点击事件,在返回调用它自己,也打印了锚,我可以

访问
$('#stop').click(function() { }); 

但是,我不希望脚本在那里(因为每页有多个项目,并且它在主链接资源中有更多意义)。如果此呼叫位于主页面的链接表中,则不会发生任何情况。

这是为什么?

是否有另一个'文档准备'包装我应该用来解决返回元素?

回答

2

如果

<div id="container"></div> 

是要追加的ajax调用的结果给该元素,

你想做的事:

$('#container').on('click', '#stop', function() { console.log('test'); }); 

或者你可以做类似

$('#stop').live('click', function(){ console.log('test'); }); 

但是我不建议如果你要在页面上处理很多事件,因为live每次使用时都会增加开销。

+0

2年后回顾这个问题,看看你做错了什么总是很有趣。当然现在使用静态父母上的委托事件:)由于这是最“正确”的方式,因此将我的答案转换为此。IMO – briansol 2015-07-09 15:51:21

-2

您的主脚本不会将事件添加到您的新元素,因为它是在元素存在之前运行的。

将它的工作创造主脚本的功能,然后简单地指定的功能,当你添加事件 -

主要脚本

var your_function = function() { 
    // your code 
} 

那么当你添加的格 -

$('#stop').click(your_function()); 

一个更好的解决方案是Brad M建议将事件添加到父项并处理它,因为它起泡。

+1

您说的无法将事件添加到元素之前是正确的,但是您可以将事件添加到静态父元素(如文档)。 jQuery有一些技巧来自动处理这些情况。至于setInterval的东西,虽然这在技术上会起作用,但它是一个解决方案的绝对黑客。在插入DOM之后,您始终可以重新附加事件处理程序,但在执行此操作时没有同步问题。 – 2013-02-21 15:04:29

+1

更不用说,对于所有继续附加到按钮的事件处理程序,只需单击一次按钮即可执行相同数量的处理程序。 – 2013-02-21 15:08:20

+0

是的,我想我会删除该建议。 – 2013-02-21 15:19:03

2

我对您的问题的理解是,您创建的点击事件不会触发通过ajax添加的元素。将处理程序附加到元素的单击事件时,仅针对当前处于DOM中的那些元素。你有几个选择来获得你想要的行为。

1)使用效率低下的“活”处理程序。(通常以毫秒为单位测量效率低下)

$('#stop').live('click', function(){}); 

2)将元素插入到DOM后,重新附加事件处理程序。

$.ajax({ 
    complete: function(){ 
     $('#idOfTheElementsYouJustInserted').click(function(){}); 
    } 
}); 

3)附加的事件处理程序的静态父元素,使得按钮被点击时,事件“气泡”上升并触发该事件。要引用创建气泡的元素,可以使用event.target,其中event是传递给函数的默认参数。

$('#staticParentElement').click(function(event) { var elementClicked = event.target; }); 
+1

嗯,我正在学习。从我+1。 – 2013-02-21 15:20:06

+0

你能详细解释一下#2吗?这是一个HEAVY页面,所以#1听起来像是一个不行。 #3似乎也可能是一个问题,因为这个元素中有多个a(它的一个ul列表) – briansol 2013-02-21 19:38:03

+1

#2是你开始的(你已经将它包含在你的问题中,并声明它不是你想要的)。去#3。这很好。你只需要一个检查来确认'event.target'是你的'#stop'元素。 – 2013-02-22 14:26:12