相关文章:
- DOM 文档对象事件模型及示例 2006-04-12 danning
- 使用监听器跟踪session的生命周期和session的属性 2006-06-24 xiejn
- Global.asa在jsp下的转换 2006-03-23 zynovo
- 对Swing线程的再思索 (下) 2004-07-14 leole
- 使用监听器Servlet 2005-08-25 chensheng913
本文探讨了在JavaScript中使用捕获事件监听器(useCapture=true)时可能遇到的问题,特别是在Safari和WebKit浏览器中。通过示例代码展示了如何设置事件监听器,并解释了事件流的捕获阶段。内容包括对捕获事件监听器的正确理解和使用,以及针对潜在问题的解决策略。
<div id="div1"> As DOM spec, <strong>Only this area</strong> will trigger the capturing event listener for click event on the containing div element. </div> <script> var div1 = document.getElementById('div1'); div1.addEventListener('click', function () { alert('ok'); }, true); </script> 又如,如果同一个监听器,在同一个元素上注册两次,一次useCapture为true,一次为false,那么在严格遵循DOM规范的浏览器 中,监听器在整个event flow中只会被调用一次;反之则会被连续调用两次,而且函数自身是无法判断到底是作为捕获事件监听器被调用,还是作为非捕获事件监听器被调用。当然,实 际上是先调用捕获事件监听器再调用非捕获事件监听器的,但是如果加上target对象上的event handler(即onclick之类的事件属性),就又产生了微妙的顺序问题。Gecko的顺序是先执行handler再执行监听器,而WebKit的 顺序是先执行捕获事件监听器,再执行handler,最后执行非捕获事件监听器。
node.addEventListener(type, listener, true); function listener(evt) { if (evt.currentTarget == evt.target) return; ... } 这样就确保了不会在target阶段执行捕获事件监听器。我们也可以判断 evt.eventPhase != evt.CAPTURING_PHASE,但是浏览器的eventPhase也可能有bug,所以最好直接判断currentTarget是否等于 target。
node.addEventListener(type, listener1, true); node.addEventListener(type, listener2, false); function listener1(evt) { if (evt.currentTarget == evt.target) return; ... } function listener2(evt) { if (evt.currentTarget != evt.target) return; ... } 或者
node.addEventListener(type, listener, true); node.parentNode.addEventListener(type, listener, true); function listener(evt) { if (evt.currentTarget == node.parentNode && evt.target != node || evt.currentTarget == evt.target) return; ... } 在执行顺序上,前者类似Gecko的行为,后者类似WebKit的行为。
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=2101666

被折叠的 条评论
为什么被折叠?