【发布时间】:2012-09-28 13:39:55
【问题描述】:
我在应用程序中放置了一个全局模式“正在加载,请稍候”<div>。每次单击 <a> 或 <input type="button"> 时都会显示。这是通过在onload 中为<body> 分配一个onclick 事件处理程序来实现的,以便在事件冒泡时执行:
<body onload="setup()">
<!-- No control over what will be here -->
</body>
<script>
function setup() {
document.getElementsByTagName('body')[0].onclick = clickFunc;
}
function clickFunc(eventData) {
var clickedElement = (window.event) ? event.srcElement : eventData.target;
if (someConditions) {
document.getElementById('modal').style.display = "block";
}
}
</script>
现在,我的标记中有一些组件(我无法控制)在它们的onclicks 中执行return false。这导致模式弹出窗口显示并在有confirm() 并且用户拒绝时停留在那里。处理这个问题的正确方法可能是preventDefault(),这样事件就不会冒泡,正如event.preventDefault() vs. return false 中所解释的那样。
但我无法控制那部分,所以:有没有办法(最好是非 jquery+跨浏览器)知道事件处理程序(在较低级别)先前执行的结果?
如果没有,我想只要组件的onclick 包含return false,我就必须避免显示模态<div>。
这是一个JSFiddle 用于测试。
更新
Bergi 下面的答案是我正在寻找的。但是,defaultPrevented 在 IE
【问题讨论】:
-
您的可点击元素上是否有任何共同的模式来识别它们,或者您无法控制的可点击元素上有任何共同的模式?
-
除了
clickedElement.onclick.toString().indexOf('return false') != -1之外,没有其他模式可以寻找。 -
遗憾的是,这不是很推荐,因为函数反编译不是有效 ECMAScript 实现的要求,我的意思是,标准不要求浏览器为您提供字符串转换执行 somefunction.toString() 时的功能...我能想到的只是查看 event.target,如果 nodeName 不是“A”,请查看 parentNode、parentNode、parentNode 等,直到其 nodeName 为“A”,然后检查 onclick 是否为空,或者直到您到达正文。但是,如果您想在自己的链接元素中使用 onclick,这将不起作用……还有其他提示可以帮助我们帮助您吗? ;)
-
感谢您的 cmets,@Áxel。在
someConditions中,我已经从事件目标中查找层次结构以查找<a>s 。问题在于可以在其onclick事件处理程序中return false的元素。我宁愿知道他们是否返回 false 以免显示对话框。如果onclick不返回false,我仍然想显示弹出窗口。 @Bergi's suggestion 是我要找的。但是,IE defaultPrevented。
标签: javascript html event-handling onclick event-bubbling