【问题标题】:Change precedence of multiple click event over the same element更改多个单击事件对同一元素的优先级
【发布时间】:2013-07-04 11:14:59
【问题描述】:

我有一个网页不能修改代码,我可以在某些地方添加一些javascript/jquery。

嗯,已经有一张图片与点击事件相关联。因为我知道元素 CLASS,所以我添加了自己的点击事件监听器:

$(".co-page-link").click(function(e) {
    ....
}

问题是我的点击事件在之前定义的事件之前触发,我想改变这种行为。如何做到这一点?

谢谢。

【问题讨论】:

  • AFAIK,您需要将代码放在之前添加的代码下方,因为没有 API 可以对事件处理程序进行排序,也没有提供执行顺序
  • 实际上如果这需要几秒钟,例如 3 秒,则在 3 秒后运行您的代码。您可以通过单击按钮上的 setTimeout 来执行此操作。
  • 如果之前的处理程序使用了一些异步函数,你需要对这些异步操作使用某种回调。我忘了,委托事件也会被触发。
  • 我应用了 F1beta 指出的解决方案。我知道这不是最优雅的解决方案,但它确实有效。如果某个字段值已更改,我每 250 毫秒检查一次,一旦更改,我将停止检查 (clearInterval)

标签: javascript jquery events click operator-precedence


【解决方案1】:

如果没有其他点击处理程序,您可以将绑定处理程序的顺序颠倒:

[].reverse.call($._data($('.co-page-link')[0]).events.click);

如果有多个元素具有类“.co-page-link”,请考虑使用循环。

请注意,此方法不公开支持,语法可能因版本而异。在旧的 jquery 版本中,使用 $.data()

对于更多的处理程序,如果你希望最后一个处理程序成为第一个被解雇的,你可以像这样 unshift 处理程序:

//set this handler in first with keeping other already bound events
var myH = $._data( $(".co-page-link")[0], "events" ).click.pop();
$._data( $(".co-page-link")[0], "events" ).click.unshift(myH);

【讨论】:

  • 是他们获取活动信息的任何方式。我的意思是我想检查按钮上附加了多少点击事件。随便猜
  • 点击处理程序:$._data( $(".co-page-link")[0], "events" ).click 所有处理程序:$._data( $(".co-page -link")[0], "events" ) 第一个参数是节点元素,而不是 jquery 对象,这就是我使用 [0] {== get(0)} 的原因,但这只会返回使用任何 jquery 绑定的事件方法。
  • 我没有尝试这个解决方案,因为你所说的关于它不受公开支持的评论并且语法可能会有所不同。谢谢。
【解决方案2】:

“问题是我的点击事件在之前定义的事件之前触发,我想改变这种行为。”

使用 jQuery 绑定的事件处理程序总是按照它们被绑定的顺序调用,但如果有其他未使用 jQuery 绑定的处理程序,它们的顺序可能会根据它们的绑定方式而有所不同(并且可能因浏览器而异)。

但是直接绑定的处理程序会在绑定到父元素或文档的委托处理程序之前调用,因此如果您在文档级别绑定委托处理程序,那么任何直接绑定到图像的处理程序都将在事件冒泡之前执行,因此你的处理程序会在之后触发:

$(document).on("click", ".co-page-link", function(e) {
    // your code
});

这样做的缺点是,如果其他代码阻止冒泡,它将无法工作,但您可以尝试。

【讨论】:

  • 它没有工作,所以我猜某处停止冒泡
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2010-11-21
  • 2017-12-05
  • 2010-12-24
相关资源
最近更新 更多