【发布时间】:2013-03-17 11:17:45
【问题描述】:
是否可以检测特定 DOM 事件是否绑定了任何事件处理程序(包括浏览器默认事件处理) - 在 Firefox 的 Greasemonkey 代码中 (EcmaScript 5.1 strict mode)?
So far I managed to cancel my click event handling when a text is selected, but I would like to cancel my event handling in all following situations where click event triggers a default action:
- 在页面上选择文本
- 显示上下文菜单(即右键单击)
- 一个链接被点击(左键点击
<a>) - 表单元素被操作(文本框获得焦点,光标开始闪烁,单选按钮被选中,...)
- 其他一些处理事件的 JavaScript 代码(例如显示弹出帮助对话框)
是否有包罗万象的机制,或者我是否需要在我的代码中明确拼写所有情况?
以下代码是我检测选择发生的方式:
var toggleHighlight = function(){
var oldTargt;
return function(e){
targt = e.target;
sel = window.getSelection();
if (!sel.isCollapsed && sel.containsNode(targt, true)) {
return;
}
...
oldTargt = targt;
}()
document.addEventListener('click', toggleHighlight);
注意事项:
- 我不想停止使用我的脚本进行传播,如果事件将被传播到其他处理程序,我想停止我的脚本。
- 如果 JQuery-event-handlers-only 解决方案没有捕获默认浏览器事件处理程序,我对它们不感兴趣。
- 如果此功能确实不存在,请引用一些文章或博客,而不仅仅是您自己的观点。
- 欢迎提出具体建议,但我主要对是否存在通用解决方案感兴趣。
更新:可接受的解决方案包括:
- 我需要检查的
if条件的详尽(ish)列表 - 通过 Firefox 插件访问的非 JavaScript 方式
- 解释 Firefox 如何知道点击有效的
<a>元素会触发重新加载新 URL + 如何无法从 javascript/插件访问此逻辑
【问题讨论】:
-
不,没有包罗万象的解决方案。我只能想到挂钩
document并检查是否针对特定事件阻止了默认值(如果停止传播,这甚至将不起作用) -
@Bergi 在我的情况下,如果传播停止就可以了,我只想在浏览器中没有其他任何事情想要做任何事情的情况下执行我的点击事件处理
-
然后将
if (! e.defaultPrevented)添加到您的toggleHighlight函数中。 -
@Bergi 感谢其中 1 个条件,仍然需要类似
if (e.thereIsADefault)
标签: javascript event-handling dom-events greasemonkey ecmascript-5