Javascript 如何使用jQuery将事件附加到动态HTML元素?
假设我有一些jQuery代码,它将事件处理程序附加到class.myclass的所有元素 例如:Javascript 如何使用jQuery将事件附加到动态HTML元素?,javascript,jquery,events,dhtml,Javascript,Jquery,Events,Dhtml,假设我有一些jQuery代码,它将事件处理程序附加到class.myclass的所有元素 例如: $("#anchor1").live("click", function() { $("#anchor1").append('<a class="myclass" href="#">test4</a>'); }); function RefreshSomeEventListener() { // Remove handler from existing el
$("#anchor1").live("click", function() {
$("#anchor1").append('<a class="myclass" href="#">test4</a>');
});
function RefreshSomeEventListener() {
// Remove handler from existing elements
$("#wrapper .specific-selector").off();
// Re-add event handler for all matching elements
$("#wrapper .specific-selector").on("click", function() {
// Handle event.
}
}
我的HTML可能如下所示:
<a class="myclass" href="#">test1</a>
<a class="myclass" href="#">test2</a>
<a class="myclass" href="#">test3</a>
在这种情况下,当用户单击aanchor1时,就会创建test4链接
test4链接没有与之关联的click处理程序,即使它有class=myclass
基本上,我希望编写一次click处理程序,并将其应用于页面加载时显示的内容和稍后通过AJAX/DHTML引入的内容。你知道我该怎么解决这个问题吗 在jQuery 1.7之后,首选的方法是和 显示了一个示例 现已弃用: 使用jQuery函数和。可在 jQuery 1.3.x 从文档中: 以文本形式显示每个段落的文本 无论何时单击警报框:
$("p").live("click", function(){
alert( $(this).text() );
});
此外,该插件可以做到这一点,并支持更多的事件
如果您的应用程序在jquery1.3+上,则使用
将处理程序绑定到事件,如 单击此处查看所有当前和未来- 匹配元素。也可以绑定自定义 事件 您想使用live功能。看 例如:
$("#anchor1").live("click", function() {
$("#anchor1").append('<a class="myclass" href="#">test4</a>');
});
function RefreshSomeEventListener() {
// Remove handler from existing elements
$("#wrapper .specific-selector").off();
// Re-add event handler for all matching elements
$("#wrapper .specific-selector").on("click", function() {
// Handle event.
}
}
将处理程序绑定到事件,如单击所有当前和未来匹配的元素。还可以绑定自定义事件
如果要向DOM添加一堆锚点,请查看事件委派 下面是一个简单的例子:
$('#somecontainer').click(function(e) {
var $target = $(e.target);
if ($target.hasClass("myclass")) {
// do something
}
});
我添加了一个新的答案,以反映稍后jQuery版本中的更改。.live方法在jQuery 1.7中已被弃用 从 从jQuery1.7开始,.live方法已被弃用。使用.on附加事件处理程序。较旧版本jQuery的用户应优先使用.delegate而不是.live 对于jQuery1.7+,您可以使用.on将事件处理程序附加到父元素,并将与“myclass”组合的选择器作为参数传递 看 所以不是
$(".myclass").click( function() {
// do something
});
你可以写
$('body').on('click', 'a.myclass', function() {
// do something
});
这将适用于正文中包含“myclass”的所有标记,无论是已经存在还是以后动态添加的标记
这里使用body标记,因为示例中没有更紧密的静态周围标记,但是当.on方法调用发生时存在的任何父标记都将起作用。例如,将添加动态元素的列表的ul标签如下所示:
$('ul').on('click', 'li', function() {
alert( $(this).text() );
});
只要ul标签存在,这将起作用,没有li元素需要存在。您可以为所有元素将一次单击事件绑定到一个页面,无论它们是否已经在该页面上,或者它们是否将在将来某个时间到达,如:
$(document).bind('click', function (e) {
var target = $(e.target);
if (target.is('.myclass')) {
e.preventDefault(); // if you want to cancel the event flow
// do something
} else if (target.is('.myotherclass')) {
e.preventDefault();
// do something else
}
});
我已经用了一段时间了。工作起来很有魅力
在jQuery 1.7及更高版本中,建议使用.on代替bind或任何其他事件委派方法,但.bind仍然有效。有时,投票最多的答案并不总是足够的:
$('body').on('click', 'a.myclass', function() {
// do something
});
这可能是一个问题,因为触发事件处理程序的顺序。如果您发现自己正在这样做,但由于处理顺序的原因,这会导致问题。。您始终可以将其包装到函数中,调用该函数时刷新侦听器
例如:
$("#anchor1").live("click", function() {
$("#anchor1").append('<a class="myclass" href="#">test4</a>');
});
function RefreshSomeEventListener() {
// Remove handler from existing elements
$("#wrapper .specific-selector").off();
// Re-add event handler for all matching elements
$("#wrapper .specific-selector").on("click", function() {
// Handle event.
}
}
因为它是一个函数,所以每当我以这种方式设置侦听器时,我通常在document ready上调用它:
$(document).ready(function() {
// Other ready commands / code
// Call our function to setup initial listening
RefreshSomeEventListener();
});
然后,每当您添加一些动态添加的元素时,请再次调用该方法:
function SomeMethodThatAddsElement() {
// Some code / AJAX / whatever.. Adding element dynamically
// Refresh our listener, so the new element is taken into account
RefreshSomeEventListener();
}
希望这有帮助
关于,如果我的选择器需要是其他元素的父元素,该怎么办?例如:$p.parent.myclass.liveclick。。。这似乎不适用于live。您可以尝试将其合并到单个查询中,如$p:has.myclass.liveclick,。。。。注意:有些情况下,live并不适用于所有事件。请查看livequery插件以获取live未提供的支持。这不再是正确答案。.live方法在jQuery 1.7中已被弃用。改为使用.on。让我们得到正确的答案[一些更新投票。或者@Matt-您想更新您的答案吗?这个出色的解决方案似乎与Fancybox中的HTML内容有关。我已恢复为手动创建处理程序。我还没有尝试iFrame内容,因此fanyxbos的内容是正文的一部分,或者在我的文档变量中是。live是已弃用且.on已出现。但不清楚当我编写$'selector'.on'event',callback{}时,它是否会工作。需要在$$document.on'event',selector',callback{}或$'body.on'event',selector',callback{}内编写所需的选择器性能如何?与直接附加事件相同吗?当元素的href地址设置为http://???$body.时不起作用。在'each','myclass',函数{//do something}@Sean我试图在每个类上制作一些东西,但都不起作用。怎么了?live已被弃用。谢谢!无法与其他答案一起使用,您的解决方案非常有效,但是如果我在添加dynamic元素后调用RefreshSomeEventListener,我的事件将被触发twice@DKMudrechenko很可能
这是因为您没有完全从中删除事件侦听器。这很有效,而且解释得也很好。下面是一篇关于如何为动态元素绑定click事件的详细文章纯javascript Anilla js解决方案:下面是live不推荐的答案。