以下是我的问题的一个例子:
HTML 的
<p><a class="clickme" href="#">I would like to say:</a></p>
的jQuery
$("a.clickme").click(function() {
$('p').append('<div><a href="#" id="say-hello">Hello</a></div>');
});
$("#say-hello").click(function(){
alert('test hello');
});
这是示例代码的小提琴: http://jsfiddle.net/johnmorris/2UVYd/2/
第一次点击功能就好了。但是,警报(或任何其他功能)不会触发新添加的元素。我基本上明白附加的元素在页面加载时不存在,所以jQuery没有“看到”它......因此,第二次点击功能没有触发。
我只是想知道是否有办法解决这个问题。而且,如果是这样,它是什么。我似乎无法理解这一点。
答案 0 :(得分:6)
您的代码无效,因为当您将其绑定到点击处理程序时,$("#say-hello")
在dom中不存在。
但是,您可以使用.on
,如下面的语法,它会查找标识为say-hello
的元素,稍后会将其添加到&#39; p&#39;,
$("p").on('click', '#say-hello', function(){
alert('test hello');
})
答案 1 :(得分:1)
您需要等待分配事件,直到元素存在:
$("a.clickme").click(function() {
$('p').append('<div><a href="#" id="say-hello">Hello</a></div>');
$("#say-hello").click(function(){
alert('test hello');
});
});
请注意,新创建的锚点的click
分配是在另一个click
回调中。
@Vega正在使用另一种称为“委托”的技术,您可以将“say-hello”的点击分配给p
而不是锚本身。单击锚点时,事件会通过DOM“冒泡”,并被p
标记上的事件侦听器捕获。这可以正常工作,但这可能不适合授权。当您在公共容器(例如UL中的LI)内部有一组项目时,通常会使用委托,这些项目都必须处理同一事件。如果您只有一个“说你好”,那么我建议不要使用委托。
如果您需要多次单击该按钮并多次插入,则委派可能是正确的选项(但您需要停止使用硬编码ID)。或者......你可以这样做:
$("a.clickme").click(function() {
$('<div><a href="#" class="say-hello">Hello</a></div>').find('.say-hello')
.click(function(){
alert('test hello');
})
.end()
.appendTo('p');
});
这段代码实际上深入研究了新创建的元素,并在附加到DOM之前附加了事件。 (哦,注意我使用的是className而不是“say-hello”的id。)
答案 2 :(得分:0)
您也可以尝试这样做,这可以避免创建具有相同ID的多个DOM元素的问题。它通过在ID名称附加1到100之间的随机数来为每个ID提供一个随机ID:
<script>
$("a.clickme").click(function() {
var newId = "say-hello" + Math.floor((Math.random()*100)+1);
$('p').append('<div><a href="#" id="' + newId +'">Hello</a></div>');
$("#"+newId).click(function(){
alert('test hello');
})
});
</script>
请注意,我在现有的<a>
点击中添加了一个点击处理程序。
Randoms不保证不会发生冲突,但要使范围足够大,这可能是一个安全的假设。或者只是使用计数器来确保没有ID冲突。
答案 3 :(得分:0)
jQuery(".your_append_element_class').live('click',function() {
// Your Code goes here..
});