<html>
<head>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">

        $(document).ready(function() {

            $("button").click(function() {
                $("h2").html("<p class='test'>click me</p>")
            });   

            $(".test").click(function(){
                alert();
            });
        });

    </script>
</head>
<body>
    <h2></h2>
    <button>generate new element</button>
</body>
</html>


我试图通过单击按钮在test中生成一个类名为<h2>的新标签。我还定义了与test相关的click事件。但是该活动无效。

任何人都可以帮忙吗?

评论

尝试使用。它将一个新的id注册到jQuery可以访问的DOM中,而

#1 楼

您正在使用的click()绑定称为“直接”绑定,它将仅将处理程序附加到已经存在的元素上。它不会绑定到将来创建的元素。为此,您必须使用on()创建“代理”绑定。


委派事件的优点是,它们可以处理以后添加到文档中的后代元素中的事件。




您正在寻找的是:




 var counter = 0;

$("button").click(function() {
    $("h2").append("<p class='test'>click me " + (++counter) + "</p>")
});

// With on():

$("h2").on("click", "p.test", function(){
    alert($(this).text());
}); 

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<h2></h2>
<button>generate new element</button> 





以上内容适用于使用jQuery 1.7+版的用户。如果您使用的是旧版本,请参考下面的上一个答案。


上一个答案:

尝试使用live()

$("button").click(function(){
    $("h2").html("<p class='test'>click me</p>")
});   


$(".test").live('click', function(){
    alert('you clicked me!');
});


为我工作。

或者用delegate()进行更新的方法:

$("h2").delegate("p", "click", function(){
    alert('you clicked me again!');
});


更新了jsFiddle。

评论


从jQuery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序。

–戴夫·贾维斯(Dave Jarvis)
2012年11月5日,3:03

它必须是$(document).on('click','.test',function(){或绑定到其他父对象才能等于.live,仅因为在最近的问题中出现

–布莱克·普拉姆(Blake Plumb)
13年4月25日在22:16



@BlakePlumb:我回顾了jQuery文档;你是对的!我将更新我的答案。感谢您的来信!

–Cᴏʀʏ
13年4月25日在22:35



抱歉,我参加晚会很晚,但是如果“ .on”与“ .click”的工作方式相同,但又具有处理动态内容的好处,那为什么我还要使用.click?我是否应该养成始终使用.on的习惯?

–mBrice1024
2015年12月10日14:36



@ModusPwnens:初始选择器$(“。test”)必须是在on()中指定为第二个参数的选择器的父级。或者,如on()文档中所指定,第二个参数选择器必须是父选择器的后代。

–Cᴏʀʏ
16年8月17日在15:47



#2 楼

.on()方法与委派事件一起使用

$('#staticParent').on('click', '.dynamicElement', function() {
    // Do something on an existent or future .dynamicElement
});


.on()方法允许您将任何所需的事件处理程序委派给:当前元素或以后添加到DOM的将来元素。

PS:请勿使用.live()!从jQuery 1.7+开始不推荐使用.live()方法。

评论


这对我有用。有趣的是,以上答案均未指出必须使用非动态父选择器的事实。难怪'.on'之前没有为我工作。

– ace。
13年2月20日在17:33

这也为我工作,而上面的那些却没有。谢谢!

–丰富
13年4月7日在10:20

这是唯一对我有用的方法,因为我将事件绑定到动态元素而不是静态父对象。完美答案。

–拉杰谢卡·雷迪(Rajshekar Reddy)
2014年1月6日7:34

我支持上述三个家伙。这是唯一为我工作的人。

–xyres
2014年4月7日在12:08

$('#parent')这是我所缺少的那个,它使on()的行为清晰明了,thx :)

– Kai Noack
2014年5月27日下午6:29

#3 楼

原因:
在jQuery中,只有在HTML代码中存在特定元素时(页面加载后),Click()事件才会绑定该元素。
它将不考虑将来动态创建的元素(未来
动态元素是通过javascript或jquery(不是在HTML中)创建的。
因此正常的click事件不会在动态元素上触发。
解决方案:
为了克服这个问题,我们应该使用on()函数。 on()可以委派当前和将来元素的事件。
delegate(),live()和on()函数比DOM元素更具优势。
delegate()和live()分别是已弃用(请勿使用)。
只能触发现有元素和将来的元素。
on可以考虑整个页面上存在的所有元素。
您应该在函数可在动态(将来)创建的元素上触发事件。
从$(document)中删除代码。就绪:
$(".test").click(function(){

  alert();

});

更改为:
$(document).on('click','.test',function(){

  alert('Clicked');

});


评论


当父级不存在并且正在动态创建时,这种情况的绝佳答案。

–west44
15年6月30日在12:07

以上所有答案都可能没有提到最重要的行$(document).on('click','。test',function()?这应该是经过检查的答案!

–亚当
19年7月12日在6:28



#4 楼

将此功能添加到您的js文件中。
将在所有浏览器上运行




 $(function() {
    $(document).on("click", '#mydiv', function() {
        alert("You have just clicked on ");
    });
}); 

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='mydiv'>Div</div> 




#5 楼

更改

 $(".test").click(function(){




 $(".test").live('click', function(){


实时演示

jQuery .live()

#6 楼

您需要使用.live才能工作:

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


,或者如果您使用的是jQuery 1.7+,请使用.on:

$(".test").on("click", "p", function(){
   alert();
});


评论


请阅读有关委托事件的DOCS。您的事件委托元素在哪里?您展示的另一个示例(使用.on())在任何情况下都不是替换.live()的确切方法。

– Roko C. Buljan
2013年4月9日15:11



#7 楼

尝试.live().delegate()

http://api.jquery.com/live/

http://api.jquery.com/delegate/

您的.test元素是在.click()方法之后添加的,因此没有附加事件。 Live和Delegate将该事件触发器提供给检查其子级的父元素,因此之后添加的任何内容仍然有效。我认为Live将检查整个文档正文,而可以将Delegate赋予一个元素,因此Delegate效率更高。

更多信息:

http:// www。 alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/

评论


从jQuery 1.71开始,不推荐使用.live(),并且.on()方法已取代了委托()

– T J
2014年8月22日17:32



#8 楼

我在jQuery的文档中找到了两种解决方案:

第一:对Body或Document使用委托

例如:

 $("body").delegate('.test', 'click', function(){
 ...
  alert('test');
 });


为什么?

答案:根据一组特定的根元素,将处理程序附加到一个或多个与选择器相匹配的所有元素的事件中,无论现在还是将来。
链接:http://api.jquery.com/delegate/

第二个:使用“ on”将您的函数放在“ $(document)”处,并将其附加到您想要的元素上触发此事件。
第一个参数是“事件处理程序”,第二个是元素,第三个是函数。
例如:

 $( document ).on( 'click', '.test', function () {
 ...
  alert('test');
 });


为什么?

答案:事件处理程序仅绑定到当前选定的元素;当您的代码调用.on()时,它们必须存在于页面上。为确保元素存在并可以选择,请在文档就绪处理程序内对页面上HTML标记中的元素执行事件绑定。如果将新HTML注入到页面中,请在将新HTML放入页面后选择元素并附加事件处理程序。或者,使用委托事件来附加事件处理程序,如下所述...
链接:https://api.jquery.com/on/

#9 楼

通过使用委托将事件应用于动态生成的内容的最佳方法。

$(document).on("eventname","selector",function(){
    // code goes here
});


所以您的代码现在是这样的

$(document).on("click",".test",function(){
    // code goes here
});


#10 楼

$(.surrounding_div_class).on( 'click', '.test', function () {
alert( 'WORKS!' );
});


仅当类为.surrounding_div_class的DIV是对象的直接父级时才起作用。test

如果div中有另一个对象将被填充无法工作。

#11 楼

您遇到的问题是,在DOM中存在带有“测试”类的任何内容之前,您正在尝试将“测试”类绑定到事件。尽管看起来这是动态的,但实际上发生的是JQuery传递了DOM并在ready()函数触发时连接了click事件,该事件在您在按钮事件中创建“ Click Me”之前发生。

通过将“测试” Click事件添加到“按钮”单击处理程序,它将在DOM中存在正确的元素后将其连接起来。

<script type="text/javascript">
    $(document).ready(function(){                          
        $("button").click(function(){                                  
            $("h2").html("<p class='test'>click me</p>")                          
            $(".test").click(function(){                          
                alert()                          
            });       
        });                                     
    });
</script>


使用live()(如其他人所指出的)是另一种方法,但我认为指出JS代码中的小错误也是一个好主意。您编写的内容没有错,只需要正确确定范围即可。对于许多传统开发人员来说,掌握DOM和JS的工作方式是棘手的事情之一。

live()是解决此问题的更干净的方法,在大多数情况下是正确的方法。实际上,它正在观察DOM并在其中的元素发生变化时重新布线。

#12 楼

.live函数效果很好。

用于动态添加元素到舞台上。

$('#selectAllAssetTypes').live('click', function(event){
                    alert("BUTTON CLICKED");
                    $('.assetTypeCheckBox').attr('checked', true);
                });


干杯,
Ankit。

评论


从Jquery 1.7开始不推荐使用Live,而推荐使用.on。从Jquery 1.9起,它甚至已被删除。 api.jquery.com/live

–利亚姆
13年4月8日在13:29

#13 楼

jQuery .on可以正常运行,但是在实现上述某些解决方案的渲染时遇到了一些问题。我在使用.on时遇到的问题是,它以某种方式呈现事件的方式与.hover方法不同。

对于也可能有此问题的任何其他人来说,都是如此。我通过为动态添加的项目重新注册悬停事件解决了我的问题:

重新注册悬停事件,因为悬停不适用于动态创建的项目。
所以每次我创建新的/动态项目,然后再次添加悬停代码。完美工作

$('#someID div:last').hover(
    function() {
       //...
    },
    function() {
       //...
    }
);


评论


悬停是mouseenter和mouseleave事件的包装器(api.jquery.com/mouseenter),而这些又是.on('mouseenter',handler)的包装器。因此,这在下面使用.on!因此,我看不出这与使用.on有何不同。在我看来,您在这里还缺少其他东西。

–利亚姆
13年4月8日在13:32

#14 楼

我正在处理向表动态添加新元素的表,并且在使用on()时,使其对我有效的唯一方法是使用非动态父级,例如:

<table id="myTable">
    <tr>
        <td></td> // Dynamically created
        <td></td> // Dynamically created
        <td></td> // Dynamically created
    </tr>
</table>

<input id="myButton" type="button" value="Push me!">

<script>
    $('#myButton').click(function() {
        $('#myTable tr').append('<td></td>');
    });

    $('#myTable').on('click', 'td', function() {
        // Your amazing code here!
    });
</script>


这真的很有用,因为要删除与on()绑定的事件,可以使用off(),要使用一次事件,可以使用one()。

#15 楼

我无法现场直播或委托来在灯箱(tinybox)中的div上工作。

我通过以下简单方式成功使用了setTimeout:

$('#displayContact').click(function() {
    TINY.box.show({html:'<form><textarea id="contactText"></textarea><div id="contactSubmit">Submit</div></form>', close:true});
    setTimeout(setContactClick, 1000);
})

function setContactClick() {
    $('#contactSubmit').click(function() {
        alert($('#contactText').val());
    })
}


#16 楼

也可以在元素内部使用onclick="do_something(this)"

#17 楼

如果您有指向某个容器或主体的动态添加链接:

var newLink= $("<a></a>", {
        "id": "approve-ctrl",
        "href": "#approve",
        "class": "status-ctrl",
        "data-attributes": "DATA"
    }).html("Its ok").appendTo(document.body);


,则可以获取其原始javascript元素并为其添加事件侦听器,例如单击:

newLink.get(0).addEventListener("click", doActionFunction);


无论您添加此新链接实例多少次,都可以像使用jquery click函数一样使用它。

function doActionFunction(e) {
    e.preventDefault();
    e.stopPropagation();

    alert($(this).html());
}


所以您会收到一条消息,提示


可以的


它具有比其他替代品更好的性能。

其他:避免使用jquery并使用纯JavaScript,可以获得更好的性能。如果您使用的是IE 8以上版本,则应使用此polyfill来使用方法addEventListener

if (typeof Element.prototype.addEventListener === 'undefined') {
    Element.prototype.addEventListener = function (e, callback) {
      e = 'on' + e;
      return this.attachEvent(e, callback);
    };
  }


#18 楼


另一个更简洁的替代方法(IMHO)是使用原始的javascript函数来响应on click事件,然后根据需要将目标元素传递回jQuery。这种方法的优点是您可以在任意位置动态添加元素,并且单击处理程序将“正常工作”,并且您不必担心将控件委派给父元素,等等。



步骤1:更新动态html以触发onclick事件。确保将“事件”对象作为参数传递



    $("button").click(function() {
        $("h2").html("<p class='test' onclick='test(event)'> click me </p>")
    });




步骤2:创建测试函数以响应click事件



    function test(e){
        alert();
    });




可选步骤3:假设您使用的是jQuery,我假设将它作为对返回源的引用很有用。按钮



    function test(e){
        alert();

        // Get a reference to the button
        // An explanation of this line is available here
        var target = (e.target)? e.target : e.srcElement;

        // Pass the button reference to jQuery to do jQuery magic
        var $btn = $(target);

    });



#19 楼

您可以单击添加动态创建的元素。下面的例子。使用何时来确保其完成。在我的示例中,我使用扩展类来捕获一个div,添加一个“单击以查看更多”范围,然后使用该范围隐藏/显示原始div。

$.when($(".expand").before("<span class='clickActivate'>Click to see more</span>")).then(function(){
    $(".clickActivate").click(function(){
        $(this).next().toggle();
    })
});


#20 楼

单击时使用“ on”绑定到已经存在的元素。例如,

$('test').on('click',function(){
    alert('Test');
})


这会有所帮助。