2012年8月26日星期日

关于自定义事件属性的讨论

关于自定义事件属性的讨论

关于自定义事件,大多数游览器都未有实现标准的方法,但是我们都可以通过JQuery prototype等库来实现自定义事件。自定义事件给我们带来了很多不一样的好处,比如在我们需要做tabs选项卡的时候,传统的方式,是利用闭包的特性,来实现这样的效果。但是有了自定义事件,那么我们完全没必要通过闭包来实现这些。

上个例子,基于JQuery。在JQuery中有trigger方法,来实现触发自定义事件。

首先需要在写dom结构时,添加上自定义的属性,如下data-tab。

    <ul id="tabs">        <li data-tab ="users"><a href="#">USERS</a></li>        <li data-tab ="groups"><a href="#">GROUPS</a></li>    </ul>    <div id="tabsContent">        <div data-tab="users" >我的</div>        <div data-tab="groups" >你的</div>    </div>

首先我们要获取,每个li与div的data-tab属性,在监听click事件时触发自定义事件。每个库对于自定义事件的写法不一样,但是理论是一样的,我们可以给它取一个命名空间,如yu.tabs。

jQuery.fn.tabs = function (control) {            var element = $(this);            control = $(control);            element.delegate('li', 'click', function () {                var tabName = $(this).attr('data-tab');                element.trigger('change.tabs', tabName);            });            element.bind('change.tabs', function (e, tabName) {                element.find('li').removeClass('active');                element.find('>[data-tab="' + tabName + '"]').addClass('active');            });            element.bind('change.tabs', function (e, tabName) {                control.find('>[data-tab]').removeClass('active');                control.find('>[data-tab="' + tabName + '"]').addClass('active');            });            var fistName = element.find('li:first').attr('data-tab');            element.trigger('change.tabs', fistName);            return this;        }

最后我们只需要调用这个JQuery的方法,tabs选项卡功能就完成了。这里的自定义事件,还可以方便扩展,不像使用传统的方式闭包那样,不易于扩展。


TAG: