Javascript 回调和事件(翻译)(4)
作者:mingcheng 来源:gracecode.com 发布时间:2009-03-28 11:47:00
更新
有些用户留言建议使用 setTimeout:
try { callback(); } catch(e){ setTimeout(function(){ throw e; }, 0); }
而下面是我的考虑
如没特别的要求,其实定时器的确也能搞定这问题。上面仅仅是举例说明了这一技术的可行性。意义在于,目前很多框架在回调系统的实现都非常的脆弱,这或许能给这些框架能它们提供更优化的思路。而定时器的实现并非实际的触发了事件,在实际事件中,事件会被顺序的执行、可相互影响(譬如冒泡)、还可以停止 -- 而这些是定时器无法做到的。
总之,最重要的是已经实现了包括 Internet Explorer 在内,使用事件执行回调的实现。如果你正编写基于事件代理的回调系统,我想你会对这一技术感兴趣的。
更新2
Prototype 在针对 Internet Explorer 的自定义事件处理上,也是同上述的方法触发回调:
http://andrewdupont.net/2009/03/24/link-dean-edwards/
译注,Prototype 1.6 对应的代码,摘记如下:
function createWrapper(element, eventName, handler) { var id = getEventID(element); // 获取绑定事件的 ID var c = getWrappersForEventName(id, eventName); // 获取对应的事件的所有回调 if (c.pluck("handler").include(handler)) return false; // 避免重复绑定 // 新建回调 var wrapper = function(event) { if (!Event || !Event.extend || (event.eventName && event.eventName != eventName)) return false; Event.extend(event); handler.call(element, event); }; // 加入到回调数组 wrapper.handler = handler; c.push(wrapper); return wrapper;}function observe(element, eventName, handler) { element = $(element); // 对应事件的元素 var name = getDOMEventName(eventName); // 事件执行方式 var wrapper = createWrapper(element, eventName, handler); // 封装回调 if (!wrapper) return element; // 绑定事件 if (element.addEventListener) { element.addEventListener(name, wrapper, false); } else { element.attachEvent("on" + name, wrapper); } return element;}// 调用方式document.observe("dom:loaded", function() { console.log("Init: 1"); DOES_NOT_EXIST++;});document.observe("dom:loaded", function() { console.log("Init: 2");});
看把 Prototype 的作者给乐的 :-/


猜你喜欢
- vue-cli npm解决vue项目中缺失core-js报错This dependency was not found:core-js/mo
- 前言subprocess库提供了一个API创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准
- 语句格式:numpy.zeros(shape, dtype=float, order='C')参数说明:shape:整型或元
- 本文主要列出来python图形开发GUI库pyqt5的窗体,控件属性与方法如果你想看看python图形开发GUI库pyqt5的基础使用方法可
- OpenAI 是一个人工智能的工具包,包括神经网络、遗传算法和有限状态机等。使用python可以非常便捷的操作OpenAI的API。一下是O
- 这段时间我一直在说设计需要有层次感,这种层次感可能有很多类型,比如色彩的层次感,或是元素的层次感。当一个设计缺乏层次感的时候页面所表现出来的
- 使用爬虫时遇到etree红线问题1.首先解释一下该问题的原因是Pycharm的解释器与所要求的解释器不匹配:解决方法很简单:将软件Pycha
- 为什么我把自己机子上的数据库备份文件往另一台机子上还原不成功?可能是你在Restore的对话框中选项不正确。Restore 有三个选项,分别
- print() 方法用于打印当前窗口的内容,支持部分或者整个网页打印。调用 print() 方法所引发的行为就像用户单击浏览器的打印按钮。通
- 在Python里面,函数可以作为参数传入一个函数,函数也可以复制给变量,通过变量调用函数。装饰器可以扩展一个函数的功能,为函数做一个装饰器注
- 写在前面Omi框架可以通过在组件上声明 data-* 把属性传递给子节点。Omi从设计之初,就是往标准的DOM标签的标准传递方式靠齐。比如:
- 采用双重循环。把图片进行“.”分割后名字问前面部分,那其余数据库中的 图片路径记录进行对比 采用vb的InStr函数 如果存在的话返回值&g
- 可扩展标记语言 (XML) 是用于描述数据集内容以及应如何将数据输出到设备上或如何在 Web 页上显示数据的语言。标记语言的创建来源于出版商
- 今天自己写个楼层效果,有一点烦躁,小地方犯错误。各位大神来修改不足啊!!!<!DOCTYPE html><html lan
- 思想:4个数字的排列,加上3个运算符的排列,使用后缀表达式的表现如下:情形一:1,2,3,4,+,-,* => 24*24*4情形二:
- 我就废话不多说了,大家还是直接看代码吧!def iou(y_true, y_pred, label: int): "&
- 介绍方法之前,我们先说说Python的解释器,由于Python是动态编译的语言,和C/C++、Java或者Kotlin等静态语言不同,它是在
- str_split不支持中文,利用mb_xx函数实现个/** * Convert a string to an array * @param
- 关于什么是并发模型,我在这里引用 Go 语言联合创造者 Rob Pike 的一段话:并发是指一次处理多件事。并行是指一次做多件事。二者不同,
- MYSQL TIMESTAMP字段进行时间加减运算在数据分析过程中,想当然地对TIMESTAMP字段进行运算,导致结果谬之千里计算公式如下-