javascript - 无论事件添加的顺序如何,如何强制 Javascript 事件首先运行?

标签 javascript jquery dom-events

我有人们在他们的页面中包含的 Javascript。在我的 Javascript 中,我有一个 jQuery 版本(为了方便引用,为 1.8),它被分成自己的命名空间,并通过全局变量引用(但不是“$”或“jQuery”这两个默认变量之一) 。这允许用户在他们的页面中使用 jQuery,并且不会干扰我在函数内部所做的事情。

所以我们有一个页面已经有 jQuery (1.4),一切都工作正常,除了用户和我的代码都在监听元素上的“单击”事件,并且他们的事件先行,所以在少数事件上他们这样做返回 false,jQuery 停止传播,我的事件永远不会被触发。我需要先进行我的事件。用户期望我的 onClick 功能仍然有效。

现在我知道 jQuery 通过 _data() 对象在内部保留自己的事件顺序,通过这个可以取消绑定(bind)现有事件,绑定(bind)我的事件,然后重新绑定(bind)现有事件,但这仅适用于通过该 jQuery 实例绑定(bind)的对象。我不想只是盲目地寻找 jQuery 对象,希望冲突是由用户自己的 jQuery 版本引起的。毕竟,当用户不通过 jQuery 绑定(bind)事件时会发生什么?尝试操作页面中现有的 jQuery 对象并不是一个好的解决方案。

我知道,根据浏览器的不同,他们使用的是 addEventListener/removeEventListenerattachEvent/detachEvent。如果我可以获得已添加事件的列表,我就可以按照我想要的顺序重新绑定(bind)它们,但我不知道如何操作。通过 Chrome 检查查看 DOM,我没有看到 onclick 绑定(bind)在任何地方(不在对象上,也不在窗口或文档上)。

我正在费尽心思地试图弄清楚 jQuery 到底在哪里绑定(bind)了它的监听。为了能够控制它自己的事件的顺序,jQuery 必须全面监听某个地方,然后触发它自己的函数,对吧?如果我能弄清楚这是在哪里完成的,我可能会深入了解如何确保我的事件始终是第一位的。或者也许有一些我在 Google 上找不到的 Javascript API。

有什么建议吗?

最佳答案

我们通过添加一个小的 jQuery 扩展来解决这个问题,该扩展在事件链的头部插入事件:

$.fn.bindFirst = function(name, fn) {
  var elem, handlers, i, _len;
  this.bind(name, fn);
  for (i = 0, _len = this.length; i < _len; i++) {
    elem = this[i];
    handlers = jQuery._data(elem).events[name.split('.')[0]];
    handlers.unshift(handlers.pop());
  }
};

然后,绑定(bind)您的事件:

$(".foo").bindFirst("click", function() { /* Your handler */ });

简单!

关于javascript - 无论事件添加的顺序如何,如何强制 Javascript 事件首先运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13979961/

相关文章:

javascript - AngularJS:在多个复选框之间进行单选

c# - 清除客户端所有文本框

javascript - 将 mousedown 事件分派(dispatch)给元素不会使其获得焦点

javascript - Python Flask 每 60 秒刷新一次表

javascript - 使用 Facebook Javascript SDK 发布到用户 friend 的墙上 - 获得有效响应但帖子不会出现在 Facebook 上

javascript - 使用 async.forEach 循环在异步函数中覆盖变量

javascript - 在 Javascript 中使用 var 和 this 有什么区别?

php - 使用 ajax 调用时,MySQL 查询数组不会被填充

java - selenium webdriver无法找到隐藏在div中的元素

javascript - 调试在特定事件上触发的所有函数