【问题标题】:Knowing if a previous handler for an event returned false. defaultPrevented in IE < 9?知道事件的先前处理程序是否返回 false。 defaultPrevented 在 IE < 9 中?
【发布时间】:2012-09-28 13:39:55
【问题描述】:

我在应用程序中放置了一个全局模式“正在加载,请稍候”&lt;div&gt;。每次单击 &lt;a&gt;&lt;input type="button"&gt; 时都会显示。这是通过在onload 中为&lt;body&gt; 分配一个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,我就必须避免显示模态&lt;div&gt;

这是一个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 中,我已经从事件目标中查找层次结构以查找 &lt;a&gt;s 。问题在于可以在其onclick 事件处理程序中return false 的元素。我宁愿知道他们是否返回 false 以免显示对话框。如果onclick 不返回false,我仍然想显示弹出窗口。 @Bergi's suggestion 是我要找的。但是,IE defaultPrevented。

标签: javascript html event-handling onclick event-bubbling


【解决方案1】:

您可以检查(window.event ? event.defaultPrevented : eventData.isDefaultPrevented()) == false 以捕获返回false 的传播事件。

【讨论】:

  • 感谢您的回答。我在fiddle 中尝试过,但isDefaultPrevented(顺便说一句,这似乎不是一个函数)始终是undefined。另外,谢谢你告诉我defaultPrevented :)
  • 呃,对非 W3 标准浏览器的嘘声(你知道我的意思)-fixed fiddle
  • 奇怪的是,它不适用于 that 浏览器(此处为 IE7)。还尝试了returnValue,解释为here,但一旦冒泡,该值似乎不可用。
  • 似乎 defaultPrevented 仅在 IE9 中受支持。如果出现另一个答案,我暂时不会接受,但这是我正在寻找的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多