带有事件触发的jQuery问题 $('.sss')。单击(函数(){ $(#a“+id).html(“fddscx”+ ""); }); $('#xxx')。单击(函数(){ 警报(“按钮发生”); });

带有事件触发的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

我单击具有class
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");
    })
})