我有人们在他们的页面中包含的 Javascript。在我的 Javascript 中,我有一个 jQuery 版本(为了方便参考,为 1.8),它被分成自己的命名空间,并通过全局变量引用(但不是“$”或“jQuery”这两个默认变量之一) 。这允许用户在他们的页面中使用 jQuery,并且不会干扰我在函数内部所做的事情。
所以我们有一个页面已经有 jQuery (1.4),一切都工作正常,除了用户和我的代码都在监听元素上的“单击”事件,并且他们的事件先行,所以在他们执行的少数事件上返回 false,jQuery 停止传播,我的事件永远不会被触发。我需要先进行我的活动。用户期待我的onClick
功能仍然有效。
现在我知道 jQuery 在内部通过_data()
对象,通过此可以取消绑定现有事件,绑定我的事件,然后重新绑定现有事件,但这仅适用于通过该 jQuery 实例绑定的对象。我不想只是盲目地寻找 jQuery 对象,希望冲突是由用户自己的 jQuery 版本引起的。毕竟,当用户不通过 jQuery 绑定事件时会发生什么?尝试操作页面中现有的 jQuery 对象并不是一个好的解决方案。
我知道,根据浏览器的不同,他们正在使用addEventListener
/removeEventListener
or attachEvent
/detachEvent
。如果我可以获得已添加事件的列表,我就可以按照我想要的顺序重新绑定它们,但我不知道如何操作。通过 Chrome 检查查看 DOM 我没有看到onclick
绑定到任何地方(不在对象上,也不在窗口或文档上)。
我正在花时间试图弄清楚 jQuery 到底在哪里绑定它的监听。为了能够控制它自己的事件的顺序,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());
}
};
然后,绑定您的事件:
$(".foo").bindFirst("click", function() { /* Your handler */ });
十分简单!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)