Heim  >  Artikel  >  Web-Frontend  >  关于javascript event flow 的一个bug详解_javascript技巧

关于javascript event flow 的一个bug详解_javascript技巧

WBOY
WBOYOriginal
2016-05-16 17:22:22938Durchsuche

我最近调netsurf也遇到一个相关的bug : alert() 被调了两次。html 代码:

复制代码 代码如下:



alert onclick example

function causealert()
{
var txt = document.getElementById("p1").textContent;
alert(txt);
}




First line of paragraph.



<script><BR>var Button1 = document.getElementById("button1");<BR>/*var Button1Click = function() { alert(1); }; <BR>Button1.addEventListener("click", Button1Click, false);*/<BR>Button1.onclick = causealert;</script>




     通过gdb, 定位到是_dom_node_dispatch_event()里面的问题:
复制代码 代码如下:

   /* The capture phase */ for (targetnr = ntargets; targetnr > 0; --targetnr)...

/* Bubbling phase */
 evt->phase = DOM_BUBBLING_PHASE;

 for (targetnr = 0; targetnr


 

事件流是这样的: p1(root)-->p2-->... --> pm --> T  (capturing phase), T (target phase), T--> pm --> ... --> p1 (bubbling phase).

规范规定capturing 和bubbling 只能选其一, 代码中在 js_dom_event_add_listener()是选capturing。因此就解释了为什么alert 被执行两回了。

修改: 根据DOM 3 规范,把上面的0改成1就行了。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn