<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>
我试图通过单击按钮在<h2>中生成一个类名为test的新标记。我还定义了一个与test关联的单击事件。但是这个事件不起作用。
有人能帮忙吗?
您正在使用的click()绑定称为“直接”绑定,它只会将处理程序附加到已经存在的元素上。它不会与将来创建的元素绑定。为此,您必须使用on()创建一个“委托”绑定。
委托事件的优点是,它们可以处理来自稍后添加到文档的后代元素的事件。
源
以下是你想要的:
Var计数器= 0;
$("按钮").click(函数(){
美元(h2)。追加(“< p class = '测试' >点击我”+(+ +计数器)+ " < / p > ")
});
// on():
美元(h2)。On ("click", "p.test", function(){
警报($(这)。text ());
});
< script src = " https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js " > < /脚本>
< h2 > < / h2 >
生成新的元素</button>
以上内容适用于使用jQuery 1.7+版本的用户。如果你使用的是旧版本,请参考下面之前的答案。
之前的回答:
尝试使用live():
$("button").click(function(){
$("h2").html("<p class='test'>click me</p>")
});
$(".test").live('click', function(){
alert('you clicked me!');
});
为我工作。尝试用jsFiddle。
或者用delegate()有一种新奇的方法:
$("h2").delegate("p", "click", function(){
alert('you clicked me again!');
});
更新的jsFiddle。
您遇到的问题是,您试图在DOM中有任何带有“test”类的东西之前将“test”类绑定到事件。虽然看起来这一切都是动态的,但真正发生的是JQuery传递DOM并在ready()函数触发时连接click事件,该事件发生在您在按钮事件中创建“click Me”之前。
通过将“test”Click事件添加到“button”单击处理程序,它将在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,并在其中的元素发生变化时重新连接内容。
Jquery .on的工作可以,但我有一些问题的渲染实现上面的一些解决方案。我使用.on的问题是,它在某种程度上呈现的事件不同于.hover方法。
只是供其他可能也有这个问题的人参考。我通过为动态添加的项目重新注册悬浮事件来解决我的问题:
重新注册悬停事件,因为悬停对动态创建的项目不起作用。
所以每次我创建新的/动态项目时,我都会再次添加悬停代码。完美的作品
$('#someID div:last').hover(
function() {
//...
},
function() {
//...
}
);
我正在使用表动态地添加新元素,当使用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()。
我在jQuery的文档中找到了两个解决方案:
首先:在Body或Document上使用委托
例句:
$("body").delegate('.test', 'click', function(){
...
alert('test');
});
Why?
答:根据一组特定的根元素,为现在或将来与选择器匹配的所有元素附加一个或多个事件处理程序。
链接:http://api.jquery.com/delegate/
第二步:将你的函数放在"$(document)"中,使用"on"并将它附加到你想要触发这个函数的元素上。
第一个参数是“事件处理器”,第二个参数是元素,第三个参数是函数。
例句:
$( document ).on( 'click', '.test', function () {
...
alert('test');
});
Why?
Answer: Event handlers are bound only to the currently selected elements; they must exist on the page at the time your code makes the call to .on(). To ensure the elements are present and can be selected, perform event binding inside a document ready handler for elements that are in the HTML markup on the page. If new HTML is being injected into the page, select the elements and attach event handlers after the new HTML is placed into the page. Or, use delegated events to attach an event handler, as described next ...
link: https://api.jquery.com/on/
另一种更简洁的方法(IMHO)是使用一个原始的javascript函数来响应一个on click事件,然后将目标元素传递回jQuery。这种方法的优点是你可以在任何地方动态地添加你的元素,点击处理程序将“正常工作”,你不需要担心把控制委托给父元素,等等。
步骤1:更新动态html以触发onclick事件。确保将'event'对象作为参数传递
$("button").click(function() {
$("h2").html("<p class='test' onclick='test(event)'> click me </p>")
});
步骤2:创建测试函数以响应单击事件
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);
});
我不能让live或委托在一个灯箱(小盒子)中的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());
})
}
原因:
在jQuery中,Click()事件直接绑定,仅当特定元素(Html代码)存在于页面(页面加载后)时,将事件处理程序附加到元素上。
动态元素是在javascript或jquery的帮助下创建的(不是在Html中)。
它不会考虑页面加载后创建的未来元素(Dynamic)。
因此,正常的单击事件不会在动态元素上触发。
解决方案:
为了克服这个问题,我们应该使用on()函数。On()可以为当前元素和未来元素委托事件。
委托事件的优点是可以将处理程序附加到将来要添加到文档中的元素。
注意:delegate(),live()和on()函数比DOM元素更有优势。从JQuery 1.7开始,delegate()和live()已弃用(不要使用它们)。
可以同时为当前和未来的元素委托事件。
你的代码应该是这样的
从$(document).ready中删除代码:
$(".test").click(function(){
alert();
});
改变为:
$(document).on('click','.test',function(){
alert('Clicked');
});
如果你有一个动态添加到某个容器或主体的链接:
var newLink= $("<a></a>", {
"id": "approve-ctrl",
"href": "#approve",
"class": "status-ctrl",
"data-attributes": "DATA"
}).html("Its ok").appendTo(document.body);
你可以使用它的原始javascript元素并添加一个事件监听器,比如click:
newLink.get(0).addEventListener("click", doActionFunction);
无论你添加多少次这个新的链接实例,你都可以像使用jquery点击函数一样使用它。
function doActionFunction(e) {
e.preventDefault();
e.stopPropagation();
alert($(this).html());
}
所以你会收到一条信息说
它的好
它比其他替代方案具有更好的性能。
额外:你可以获得更好的性能避免jquery和使用纯javascript。如果你使用的是ie8版本,你应该使用这个polyfill来使用addEventListener方法
if (typeof Element.prototype.addEventListener === 'undefined') {
Element.prototype.addEventListener = function (e, callback) {
e = 'on' + e;
return this.attachEvent(e, callback);
};
}