欢迎访问中国最大的EXTJS讨论社区 首页 论坛 教程

Ext教程-一起Ext

当前位置: 首页 > 教程 > Javascript >

Javascript框架的自定义事件

时间:2009-04-09 16:36来源: 作者: 点击:
Javascript框架的自定义事件,很多 Javascript 框架都提供了自定义事件(custom events),例如 jQuery、YUI 以及 Dojo 都支持“document ready”事件。而部分自定义事件是源自回调(callback)。

  

简而言之,殊途同归,只是针对 Internet Explorer 使用了 propertychange 事件作为触发器。

更新

有些用户留言建议使用 setTimeout:

try { callback(); } catch(e){ setTimeout(function(){ throw e; }, 0); }

而下面是我的考虑

如没特别的要求,其实定时器的确也能搞定这问题。
上面仅仅是举例说明了这一技术的可行性。

意义在于,目前很多框架在回调系统的实现都非常的
脆弱,这或许能给这些框架能它们提供更优化的思路。
而定时器的实现并非实际的触发了事件,在实际事件
中,事件会被顺序的执行、可相互影响(譬如冒泡)、
还可以停止 -- 而这些是定时器无法做到的。

总之,最重要的是已经实现了包括 Internet Explorer 在内,使用事件执行回调的实现。如果你正编写基于事件代理的回调系统,我想你会对这一技术感兴趣的。

更新2

Prototype 在针对 Internet Explorer 的自定义事件处理上,也是同上述的方法触发回调:

译注,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 的作者给乐的 :-/

-- Split --

在本人看来,原文的作者表述的技术点,除了如何创建健壮的回调系统外,其实还有两条。

其一,就是如何保证在出现异常的时,继续运行期望的代码;其二,就是如何创建互不干扰的“运行环境”。

原文提到的 createEvent 和 setTimeout 都是好办法,只是处理原作者所言在回调系统中,的确使用 createEvent 会比较合适。setTimeout 相对应的详细信息,。

而即使出错也能继续运行期望的代码,其实可以考虑使用 ,下面是个例子:

var callbacks = [
  function() { console.log(0); },
  function() { console.log(1); throw new Error; },
  function() { console.log(2); },
  function() { console.log(3); }
];

for(var i = 0, len = callbacks.length; i < len; i++) {
    try {
        callbacks[i]();
    } catch(e) {
        console.info(e); // 获得异常信息
    } finally {
        continue;
    }
}

这一灵感同样来自 Dean Edwards ,在这里也贴下吧:

function iterate(callbacks, length, i) {
    if (i >= length) return;

    try {
        callbacks[i]();
    } catch(e) {
        throw e;
    } finally {
        iterate(callbacks, length, i+1);
    }
}

最后,留个小问题。谁知道上述的代码中,留言者提出的为什么异常到最后才打印出来不?

声明:本站教程文章版权为一起Ext(http://www.17ext.com/)所有,转载请注明出处
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容