手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >关于javascript event flow 的一个bug详解
关于javascript event flow 的一个bug详解
摘要:我最近调netsurf也遇到一个相关的bug:alert()被调了两次。html代码:复制代码代码如下:alertonclickexampl...

我最近调netsurf也遇到一个相关的bug : alert() 被调了两次。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>

<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).

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

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

【关于javascript event flow 的一个bug详解】相关文章:

JavaScript中的Math.sin()方法使用详解

JavaScript中的Math.E属性使用详解

JavaSacript中charCodeAt()方法的使用详解

IE中jscript/javascript的条件编译

JavaScript的document和window对象详解

JavaScript中switch语句的用法详解

JavaScript中getUTCMinutes()方法的使用详解

JavaScript Date对象详解

JavaScript中的Math.LOG2E属性使用详解

JavaScript中的replace()方法使用详解

精品推荐
分类导航