网络编程
位置:首页>> 网络编程>> JavaScript>> Javascript 回调和事件(翻译)(4)

Javascript 回调和事件(翻译)(4)

作者:mingcheng 来源:gracecode.com 发布时间:2009-03-28 11:47:00 

标签:JavaScript框架,回调,事件

更新

有些用户留言建议使用 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 的作者给乐的 :-/

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com