关于javascript event flow 的一个bug详解


Posted in Javascript onSeptember 17, 2013

我最近调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 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).

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

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

Javascript 相关文章推荐
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 Javascript
jQuery插件开发全解析
Oct 10 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
Apr 08 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
Jan 26 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
Jul 09 Javascript
将json转换成struts参数的方法
Nov 08 Javascript
js常用的继承--组合式继承
Mar 06 Javascript
protractor的安装与基本使用教程
Jul 07 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
antd日期选择器禁止选择当天之前的时间操作
Oct 29 Javascript
解决VueCil代理本地proxytable无效报错404的问题
Nov 07 Javascript
Node.js开发指南中的简单实例(mysql版)
Sep 17 #Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
Sep 16 #Javascript
判断一个变量是数组Array类型的方法
Sep 16 #Javascript
jquery实现div阴影效果示例代码
Sep 16 #Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
Sep 16 #Javascript
document.documentElement和document.body区别介绍
Sep 16 #Javascript
使用js在页面中绘制表格核心代码
Sep 16 #Javascript
You might like
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
javascript内置对象arguments详解
2014/03/16 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
javascript实现商品图片放大镜
2019/11/28 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
python自动下载图片的方法示例
2020/03/25 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
服务中心夜班服务员岗位职责
2013/11/27 职场文书
报关专员求职信范文
2014/02/22 职场文书
2015年市场部工作总结
2015/04/30 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
宾馆客房管理制度
2015/08/06 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python