带有事件触发的jQuery问题 $('.sss')。单击(函数(){ $(#a“+id).html(“fddscx”+ ""); }); $('#xxx')。单击(函数(){ 警报(“按钮发生”); });
我单击具有class带有事件触发的jQuery问题 $('.sss')。单击(函数(){ $(#a“+id).html(“fddscx”+ ""); }); $('#xxx')。单击(函数(){ 警报(“按钮发生”); });,jquery,Jquery,我单击具有classsss的内容。然后出现一个id为xxx的按钮。为什么我点击它时它不给我一个提示 谢谢。它不起作用,因为您在元素成为dom的一部分之前创建了处理程序。 您应该在容器元素上使用。委托允许您处理当前和未来元素的事件 你的例子是 $('.sss').click(function() { $("#a"+id).html("<textarea id=\"txt\" rows=\"8\" cols=\"75\">fddscx</textarea> <br
sss
的内容。然后出现一个id为xxx的按钮。为什么我点击它时它不给我一个提示
谢谢。它不起作用,因为您在元素成为dom的一部分之前创建了处理程序。 您应该在容器元素上使用。委托允许您处理当前和未来元素的事件 你的例子是
$('.sss').click(function() {
$("#a"+id).html("<textarea id=\"txt\" rows=\"8\" cols=\"75\">fddscx</textarea> <br />"+
"<input type=\"button\" id=\"xxx\" value=\"Do smth button\" class=\"submit_button\" />");
});
$('#xxx').click(function() {
alert("button happened");
});
这将不起作用,因为您的按钮已动态添加到文档中,并且您已将click事件添加到尚不存在的元素中。单击
.sss
元素后,它将存在
您有两种解决问题的方法:
解决方案:使用live()
/.delegate()
而不是。单击()
您可以使用.click()
而不是.live()
,它将事件绑定到现有的和未来的元素(但不要将其视为银弹,并开始在任何地方使用它)。这实际上将单击事件绑定到文档
,并检查是否在与选择器匹配的元素上触发了实际的单击事件。这意味着执行所有这些检查时,执行live()
(以及.delegate()
)功能的频率要高得多。因此,明智地使用它:
function clickHandler(){
alert("button happened");
}
$('#someContainer').delegate('.sss', 'click' , clickHandler);
最佳解决方案:即使在创建按钮后也要附加
当然,最好和正确的方法是在创建元素后绑定事件。这就是.sss
元素的单击事件:
$('#xxx').live("click", function() {
alert("button happened");
})
$('.sss')。单击(函数(){
$(#a“+id).html(“fddscx
”+
"");
$('#xxx')。单击(函数(){
警报(“按钮发生”);
})
})
我建议您使用第二种解决方案
让我们比较一下这些解决方案
活动登记
.click()
和.live()
都必须先执行jQuery选择器,然后绑定事件(.click()
直接到所选元素,.live()
到文档
,并将jQuery选择器与之一起保存,无论是否存在具有该选择器的任何元素)
.delegate()
选择它将事件绑定到的一个元素。与.live()
类似,它还保存了选择器
执行速度
.click()
显然是这里的赢家,因为它将直接在元素上执行,而不需要任何选择器匹配开销
.delegate()
和.live()
都有一些选择器匹配的开销。但更大的问题是,假设用户点击整个文档(这是非常常见的,因为用户经常通过点击进行交互)。使用.live()
时,将对每次单击进行评估。根据容器选择的.delegate()
也可以这样说。它们执行的事件都比实际应该执行的要多得多
当单击发生时,它会一直冒泡到它的容器(无论是文档
还是与.delegate()
关联的其他容器)。每次单击都必须评估目标元素是否与选择器匹配。如果是这样,jQuery还会执行随.live()
或.delegate()
事件绑定一起提供的事件处理程序
判决
与用户单击文档中的某个内容(无论什么)时评估选择器eac相比,执行一次jQuery选择器仍然没有那么糟糕。因此,我发现.live()
和.delegate()
事件注册类似,应该尽可能避免
尽可能使用直接事件绑定。这是最快的执行速度,通常比事件注册更频繁。@Robert Koritnik-为什么是live而不是delegate?@dhinesh yeah,当然,我知道它可以工作,但是live的开销更大,而且它只是出于遗留原因才出现在api中。@redsquare:因为他没有说他总是将该按钮放在特定的容器中。如果共同祖先是BODY
,那么使用live
还是delegate
并不重要。它们都将绑定到同一个元素,使它们相等。事实上,当你用一个代替另一个的时候,我想这已经没什么关系了。主要区别在于使用delegate
单击求值的频率可能会降低。关于这方面的进一步阅读:@redqueare:您在哪里读到live()
已经过时,并且出于兼容性原因,应该使用delegate()
?它们的用途非常相似,但仍然不同。因此,两者都是有效的解决方案。
$('.sss').click(function() {
$("#a"+id).html("<textarea id=\"txt\" rows=\"8\" cols=\"75\">fddscx</textarea> <br />"+
"<input type=\"button\" id=\"xxx\" value=\"Do smth button\" class=\"submit_button\" />");
$('#xxx').click(function() {
alert("button happened");
})
})