關(guān)于javascript event flow 的一個(gè)bug詳解
我最近調(diào)netsurf也遇到一個(gè)相關(guān)的bug : alert() 被調(diào)了兩次。html 代碼:
<html>
<head>
<title>alert onclick example</title>
<script type="text/javascript">
function causealert()
{
var txt = document.getElementById("p1").textContent;
alert(txt);
}
</script>
</head>
<body>
<div style="border: 1px solid red">
<p id="p1">First line of paragraph.<br /></p>
</div><br />
<button id="button1" >add another textNode.</button>
<script>
var Button1 = document.getElementById("button1");
/*var Button1Click = function() { alert(1); };
Button1.addEventListener("click", Button1Click, false);*/
Button1.onclick = causealert;
</script>
</body>
</html>
通過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 < ntargets; ++targetnr)
事件流是這樣的: p1(root)-->p2-->... --> pm --> T (capturing phase), T (target phase), T--> pm --> ... --> p1 (bubbling phase).
規(guī)范規(guī)定capturing 和bubbling 只能選其一, 代碼中在 js_dom_event_add_listener()是選capturing。因此就解釋了為什么alert 被執(zhí)行兩回了。
修改: 根據(jù)DOM 3 規(guī)范,把上面的0改成1就行了。
相關(guān)文章
- 打算做一個(gè)js面向?qū)ο蟮呢澇陨?但是最終是流產(chǎn)了,整理了下廢棄的代碼,回顧了下PPT.想學(xué)習(xí)js面向?qū)ο蟮呐笥岩部梢詤⒖枷隆?/div> 2011-08-08
js+html5實(shí)現(xiàn)canvas繪制網(wǎng)頁時(shí)鐘的方法
這篇文章主要介紹了js+html5實(shí)現(xiàn)canvas繪制網(wǎng)頁時(shí)鐘的方法,涉及html5圖形繪制的基礎(chǔ)技巧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05mint-ui的search組件在鍵盤顯示搜索按鈕的實(shí)現(xiàn)方法
這篇文章主要介紹了mint-ui的search組件在鍵盤顯示搜索按鈕的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-10-10JavaScript圖片上傳并預(yù)覽的完整實(shí)例
上傳是個(gè)老生常談的話題了,多數(shù)情況下各位想必用的是uplodify,webUploader之類的插件,這篇文章主要給大家介紹了關(guān)于JavaScript圖片上傳并預(yù)覽的相關(guān)資料,需要的朋友可以參考下2022-01-01ES6 Symbol數(shù)據(jù)類型的應(yīng)用實(shí)例分析
這篇文章主要介紹了ES6 Symbol數(shù)據(jù)類型的應(yīng)用,結(jié)合實(shí)例形式分析了ES6 Symbol數(shù)據(jù)類型的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-06-06最新評論