Jquery 单击事件不';不处理动态生成的元素 $(文档).ready(函数(){ $(“按钮”)。单击(函数(){ $(“h2”).html(单击我) }); $(“.test”)。单击(函数(){ 警惕(); }); }); 生成新元素
我试图通过单击按钮在Jquery 单击事件不';不处理动态生成的元素 $(文档).ready(函数(){ $(“按钮”)。单击(函数(){ $(“h2”).html(单击我) }); $(“.test”)。单击(函数(){ 警惕(); }); }); 生成新元素,jquery,events,Jquery,Events,我试图通过单击按钮在中生成一个类名为test的新标记。我还定义了一个与test关联的点击事件。但这项活动不起作用 有人能帮忙吗?您正在使用的click()绑定称为“直接”绑定,它只将处理程序附加到已经存在的元素上。它不会绑定到将来创建的元素。为此,您必须使用创建“委托”绑定 委派事件的优点是,它们可以处理来自子元素的事件,这些子元素将在以后添加到文档中 以下是您要查找的内容: var计数器=0; $(“按钮”)。单击(函数(){ $(“h2”)。追加(单击我“+(++counter)+”)
中生成一个类名为test
的新标记。我还定义了一个与test
关联的点击事件。但这项活动不起作用
有人能帮忙吗?您正在使用的click()
绑定称为“直接”绑定,它只将处理程序附加到已经存在的元素上。它不会绑定到将来创建的元素。为此,您必须使用创建“委托”绑定
委派事件的优点是,它们可以处理来自子元素的事件,这些子元素将在以后添加到文档中
以下是您要查找的内容:
var计数器=0;
$(“按钮”)。单击(函数(){
$(“h2”)。追加(单击我“+(++counter)+”
)
});
//带on()
$(“h2”)。在(“单击”,“p.test”,函数()上{
警报($(this.text());
});代码>
生成新元素
您需要使用它才能工作:
<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>
或者,如果您使用的是jquery 1.7+版本,请使用:
改变
$(".test").on("click", "p", function(){
alert();
});
到
尝试.live()
或.delegate()
您的.test
元素是在.click()
方法之后添加的,因此它没有附加事件。Live和Delegate将该事件触发器提供给检查其子元素的父元素,因此之后添加的任何内容仍然有效。我认为Live将检查整个文档体,而委托可以被赋予一个元素,因此委托更有效
更多信息:
您遇到的问题是,您试图在DOM
中存在任何带有“test”类的内容之前,将“test”类绑定到事件。尽管看起来这一切都是动态的,但真正发生的是JQuery
在DOM
上传递,并在启动ready()
函数时连接click事件,这发生在您在按钮事件中创建“click Me”之前
通过将“test”Click事件添加到“button”Click处理程序,它将在DOM
中存在正确的元素后将其连接起来
$(".test").live('click', function(){
$(文档).ready(函数(){
$(“按钮”)。单击(函数(){
$(“h2”).html(单击我
)
$(“.test”)。单击(函数(){
警报()
});
});
});
使用live()。你写的没有错,只是需要正确地确定范围。对于许多传统开发人员来说,掌握DOM
和JS的工作原理是一件棘手的事情
live()
是一种更干净的处理方法,在大多数情况下是正确的方法。它本质上是监视DOM
,并在其中的元素发生变化时重新连接 。live功能非常有效
它用于向舞台动态添加元素
<script type="text/javascript">
$(document).ready(function(){
$("button").click(function(){
$("h2").html("<p class='test'>click me</p>")
$(".test").click(function(){
alert()
});
});
});
</script>
干杯,
Ankit.使用
方法允许您将任何所需的事件处理程序委托给:
当前元素或以后添加到DOM的未来元素
注意:不要使用.live()
!从jQuery 1.7+开始,不推荐使用.live()
方法。上的jQuery.on
工作正常,但我在实现上述一些解决方案时遇到了一些问题。我使用
上的.on的问题是,它以某种方式呈现的事件与.hover
方法不同
仅供有问题的其他人参考。我通过为动态添加的项目重新注册悬停事件解决了问题:
重新注册悬停事件,因为悬停不适用于动态创建的项。
因此,每次创建新的/动态项时,我都会再次添加悬停代码。完美地工作
$('#staticParent').on('click', '.dynamicElement', function() {
// Do something on an existent or future .dynamicElement
});
我正在处理动态向表中添加新元素的表,在使用on()时,使其生效的唯一方法是使用非动态父项作为:
$('#someID div:last').hover(
function() {
//...
},
function() {
//...
}
);
//动态创建
//动态创建
//动态创建
$(“#myButton”)。单击(函数(){
$('#myTable tr')。追加('');
});
$('#myTable')。在('click','td',function()上{
//你的惊人代码在这里!
});
这非常有用,因为要删除与绑定的事件,您可以使用;要使用一次事件,您可以使用。在js文件中添加此函数。
它将在每个浏览器上运行
$(函数(){
$(文档)。在(“单击“,”#mydiv',函数()上){
警报(“您刚刚点击”);
});
});代码>
Div
仅当类的DIV.contributed_DIV_类是object.test的直接父级时,才会工作
如果div中有另一个对象将被填充,那么它将无法工作。我在jQuery的文档中找到了两种解决方案:
第一:在正文或文档上使用委托
例如:
$(.surrounding_div_class).on( 'click', '.test', function () {
alert( 'WORKS!' );
});
为什么?
回答:根据一组特定的根元素,现在或将来为与选择器匹配的所有元素的一个或多个事件附加一个处理程序。
链接:
第二:将your函数放在“$(文档)”处,使用
$('#staticParent').on('click', '.dynamicElement', function() {
// Do something on an existent or future .dynamicElement
});
$('#someID div:last').hover(
function() {
//...
},
function() {
//...
}
);
<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>
$(.surrounding_div_class).on( 'click', '.test', function () {
alert( 'WORKS!' );
});
$("body").delegate('.test', 'click', function(){
...
alert('test');
});
$( document ).on( 'click', '.test', function () {
...
alert('test');
});
$("button").click(function() {
$("h2").html("<p class='test' onclick='test(event)'> click me </p>")
});
function test(e){
alert();
});
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);
});
$('#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());
})
}
$(document).on("eventname","selector",function(){
// code goes here
});
$(document).on("click",".test",function(){
// code goes here
});
$(".test").click(function(){
alert();
});
$(document).on('click','.test',function(){
alert('Clicked');
});
$.when($(".expand").before("<span class='clickActivate'>Click to see more</span>")).then(function(){
$(".clickActivate").click(function(){
$(this).next().toggle();
})
});
var newLink= $("<a></a>", {
"id": "approve-ctrl",
"href": "#approve",
"class": "status-ctrl",
"data-attributes": "DATA"
}).html("Its ok").appendTo(document.body);
newLink.get(0).addEventListener("click", doActionFunction);
function doActionFunction(e) {
e.preventDefault();
e.stopPropagation();
alert($(this).html());
}
if (typeof Element.prototype.addEventListener === 'undefined') {
Element.prototype.addEventListener = function (e, callback) {
e = 'on' + e;
return this.attachEvent(e, callback);
};
}
$('test').on('click',function(){
alert('Test');
})