【发布时间】:2012-12-20 20:26:56
【问题描述】:
我有人们在他们的页面中包含的 Javascript。在我的 Javascript 中,我有一个 jQuery 版本(1.8 以便于参考),它被划分到自己的命名空间中,并通过全局变量引用(但不是“$”或“jQuery”的两个默认变量之一) .这允许用户在他们的页面中使用 jQuery,并且不会干扰我在函数内部执行的操作。
所以我们有一个已经有 jQuery (1.4) 的页面,一切正常,除了用户和我的代码都在监听元素上的“点击”事件,而且他们的事件是第一个,所以在少数事件上他们这样做返回 false,jQuery 停止传播,我的事件永远不会被触发。我需要我的活动先进行。用户希望我的 onClick 功能仍然有效。
现在我知道 jQuery 通过 _data() 对象在内部保持自己的事件顺序,通过它可以取消绑定现有事件,绑定我的事件,然后重新绑定现有事件,但这仅适用于绑定的对象通过那个jQuery实例。我宁愿不要盲目地寻找 jQuery 对象,希望冲突是由用户自己的 jQuery 版本引入的。毕竟当用户不通过 jQuery 绑定事件时会发生什么?试图操作页面中现有的 jQuery 对象并不是一个好的解决方案。
我知道,根据浏览器的不同,他们使用addEventListener/removeEventListener 或attachEvent/detachEvent。如果我能获得已添加事件的列表,我可以按照我想要的顺序重新绑定它们,但我不知道如何。通过 Chrome 检查查看 DOM,我看不到 onclick 绑定在任何地方(不在对象上,也不在窗口或文档上)。
我正忙着弄清楚 jQuery 究竟在哪里绑定了它的监听。为了能够控制自己事件的顺序,jQuery 必须在某个地方全神贯注地监听,然后触发自己的函数,对吗?如果我能弄清楚这是在哪里完成的,我可能会深入了解如何确保我的活动始终是第一位的。或者也许有一些我在 Google 上找不到的 Javascript API。
有什么建议吗?
【问题讨论】:
-
不,不可能从 DOM 中获取
addEventListener绑定的事件。您对它们的唯一引用是 jQuery 的data对象。 -
顺便说一句,“魔法”发生了here
-
为什么用户要停止事件传播?
-
Aaron,在他们的情况下,他们使用的是链接 () 加上背景图片,我相信它会让它看起来像一个按钮。然后他们在自定义对话框中弹出内容,但不希望页面导航实际继续,因为它会覆盖整个页面。我知道这看起来很糟糕,但是嘿,这是他们的页面。
标签: javascript jquery dom-events