【问题标题】:jQuery Global Event Listener [duplicate]jQuery全局事件监听器[重复]
【发布时间】:2014-05-31 21:49:16
【问题描述】:

tt我有两个这样的功能:

function fn1() {
    $(".element").append("<div class='trigger'></div>");
}

function fn2() {
    $(".element").append("<div class='trigger'></div>");
}

和一位听众:

$(".trigger").click(function() {
    // do some magic with $(this) element
});

问题是如果单击事件侦听器位于 fn1 和 fn2 之外,则在单击动态创建的元素(触发器)时不会看到。

如何让事件监听器全局监听?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

jsFiddle Demo

使用on

将点击处理程序委托给.trigger的所有当前和未来实例
$("body").on("click",".trigger",function() {
    // do some magic with $(this) element
});

编辑

jsFiddle Demo

Re:您能否建议如何使用 on 语句创建悬停侦听器?

悬停在这里确实是一个极端情况。使用流利的方法,您可以使用$().hover(function(){},function(){})。但是,使用on 的情况并非如此。为了使用它,你实际上必须使用两个单独的委托 mouseentermouseleave

$("body").on("mouseenter",".trigger",function() {
    // do some magic with $(this) element
});
$("body").on("mouseleave",".trigger",function() {
    // do some magic with $(this) element
});

【讨论】:

  • 这不起作用,仍然没有看到点击事件。问题仍然存在,因为新元素是在函数内部创建的。如果我也将监听器放在函数中,那么它可以看到点击事件
  • @user3695709 - 一定有其他因素影响您的代码。您在控制台中看到任何错误吗?看看这个 jsfiddle 演示:jsfiddle.net/qPYLh 它演示了这种方法的工作原理。
  • 对不起,这是我的错误。您能否建议如何使用 on 语句创建悬停侦听器?
  • @user3695709 - 当然,请参阅编辑。
【解决方案2】:

试试这个:

$("body").on("click", ".trigger", function() {
// do some magic with $(this) element
});

【讨论】:

  • 这是做什么的?为什么它解决了OP的问题?请解释您的解决方案(和问题)。
  • 因为触发器类是加载后添加到dom中的。因此是以某种方式重新检查DOM,因此找到著名的类并在单击时触发相应的事件。
  • 这不会重新检查 DOM,事件绑定到 body,当 body 听到点击时,它会将事件委托给 .trigger,所以如果 .trigger 是目标或目标的祖先,事件将被执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2021-10-17
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多