`
caibinghong
  • 浏览: 149812 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

jQuery.event自定义事件机制-jQuery.event.special范例

 
阅读更多

什么时候要用到自定义函数?有些浏览器并不兼容某类型的事件,如IE6~8不支持hashchange事件,你无法通过jQuery(window).bind('hashchange', callback)来绑定这个事件,这个时候你就可以通过jQuery自定义事件接口来模拟这个事件,做到跨浏览器兼容。

原理
jQuery(elem).bind(type, callbakc)实际上是映射到 jQuery.event.add(elem, types, handler, data)这个方法,每一个类型的事件会初始化一次事件处理器,而传入的回调函数会以数组的方式缓存起来,当事件触发的时候处理器将依次执行这个数组。

jQuery.event.add方法在第一次初始化处理器的时候会检查是否为自定义事件,如果存在则将会把控制权限交给自定义事件的事件初始化函数,同样事件卸载的jQuery.event.remove方法在删除处理器前也会检查此。

如jQuery源码:

初始化处事件处理器

// Check for a special event handler
// Only use addEventListener/attachEvent if the special
// events handler returns false
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
        // Bind the global event handler to the element
        if ( elem.addEventListener ) {
                elem.addEventListener( type, eventHandle, false );

        } else if ( elem.attachEvent ) {
                elem.attachEvent( "on" + type, eventHandle );
        }
}



卸载处理器:

if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
        jQuery.removeEvent( elem, type, elemData.handle );
}



入口

jQuery.event.special[youEvent] = {
        /**
         * 初始化事件处理器 - this指向元素
         * @param 附加的数据
         * @param 事件类型命名空间
         * @param 回调函数
         */
        setup: function (data, namespaces, eventHandle) {
        },
        /**
         * 卸载事件处理器 - this指向元素
         * @param 事件类型命名空间
         */
        teardown: function (namespaces) {
        }
};



事实上jQuery自定义事件那些接收的参数有点鸡肋,需要hack与能hack的事件就那么一点点,且限制颇多,一般情况下很少使用到。

接下来我们做一个最简单的自定义插件,给jQuery提供input跨浏览器事件支持。input事件不同于keydown与keyup,它不依赖键盘响应,只要值改变都会触发input事件,比如粘贴文字、使用在线软键盘等。

范例

/*
* jQuery input event
* Author: tangbin
* Blog: http://www.planeart.cn
* Date: 2011-08-18 15:15
*/
(function ($) {

// IE6\7\8不支持input事件,但支持propertychange事件
if ('onpropertychange' in document) {
        // 检查是否为可输入元素
        var rinput = /^INPUT|TEXTAREA$/,
                isInput = function (elem) {
                        return rinput.test(elem.nodeName);
                };
                
        $.event.special.input = {
                setup: function () {
                        var elem = this;
                        if (!isInput(elem)) return false;
                        
                        $.data(elem, '@oldValue', elem.value);
                        $.event.add(elem, 'propertychange', function (event) {
                                // 元素属性任何变化都会触发propertychange事件
                                // 需要屏蔽掉非value的改变,以便接近标准的onput事件
                                if ($.data(this, '@oldValue') !== this.value) {
                                        $.event.trigger('input', null, this);
                                };
                                
                                $.data(this, '@oldValue', this.value);
                        });
                },
                teardown: function () {
                        var elem = this;
                        if (!isInput(elem)) return false;
                        $.event.remove(elem, 'propertychange');
                        $.removeData(elem, '@oldValue');
                }
        };
};

// 声明快捷方式:$(elem).input(function () {});
$.fn.input = function (callback) {
        return this.bind('input', callback);
};

})(jQuery);



调用:

jQuery(elem).bind('input', function () {});


 

分享到:
评论

相关推荐

    jquery.i18n.properties-1.0.9.js

    jquery.i18n.properties-1.0.9.js 下载

    jquery.event.drag jquery拖动插件

    1. **事件绑定**:`jquery.event.drag`通过绑定`mousedown`、`mousemove`、`mouseup`等鼠标事件来实现拖动行为。当用户按下鼠标并移动时,元素会跟随鼠标移动,松开鼠标时停止。 2. **距离阈值**:插件允许设置启动...

    jquery.datepicker-zh-CN.js

    <script src="./public/js/jquery-ui-1.10.3.min.js"> <script src="./public/js/jquery.datepicker-zh-CN.js"></script> <link href="./public/css/jqueryui/jquery-ui-1.10.3.min.css" rel="stylesheet"> $( "#...

    jquery.i18n.properties-min-1.0.9.js文件下载

    此外,jQuery i18n Properties插件还支持动态切换语言,以及自定义默认语言等功能,使得开发者在处理多语言场景时更加灵活。 总结来说,jQuery i18n Properties Minified 1.0.9.js是一款强大且实用的前端国际化工具...

    jquery.event.drag-2.0.rar

    `jquery.event.drag-2.0.js`是该插件的主要实现文件,它扩展了jQuery的核心事件系统,为DOM元素添加了自定义的拖放事件处理。这些事件包括`dragstart`、`drag`、`dragend`等,它们分别对应拖放操作的开始、进行中和...

    jquery.qrcode.min.js---二维码的jquery插件

    jquery.qrcode.min.js 二维码的jquery插件

    JQuery1.4.2(jquery-1.4.2.js jquery-1.4.2.min.js jquery-1.4.2-vsdoc.js jquery-1.4.2-vsdoc_en.js jquery.cookie.js)

    jquery-1.4.2.js jquery-1.4.2.min.js jquery-1.4.2-vsdoc.js 中文版vsdoc jquery-1.4.2-vsdoc_en.js jquery.cookie.js

    jquery.i18n.properties-min-1.0.9.js前端国际化文件

    jquery.i18n.properties-min-1.0.9.js前端国际化文件,项目中用到的前端国际化文件。 $.i18n.properties( {  name : 'web_i18n', // Resource name  path : '/resources/i18n/', //Resource path  cache : true, ...

    jquery.ui.datepicker-zh-CN.js

    jquery-ui日历控件还是很人性化的,但官网没找到很好的中文版,这里上传一下

    jquery-3.7.0.min.js(jQuery下载)

    jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)...

    jquery.editable-select

    4. **API 和事件**:`jquery.editable-select` 提供了一系列 API 方法和事件,允许开发者自定义其行为。例如,你可以通过 API 设置或获取选中项,监听用户输入或选择变化的事件,甚至可以添加或移除选项。 5. **...

    jquery所有版本

    jquery-1.2.3.js jquery-1.2.3.min.js jquery-1.2.6.js jquery-1.2.6.min.js jquery-1.3.0.js jquery-1.3.0.min.js jquery-1.3.1.js jquery-1.3.1.min.js jquery-1.3.2.js jquery-1.3.2.min.js jquery-1.4.0.js ...

    jquery.layout 布局插件精简版

    4. **事件处理**:插件提供了丰富的事件,如`onresize`、`onopen`等,允许开发者在特定布局动作发生时执行自定义代码。 5. **配置选项**:`jQuery.layout`拥有大量的配置选项,如`paneSelector`用于指定布局区域的...

    jquery-ui-1.8.16.custom.min.js/jquery-ui-1.8.16.custom.css

    这个压缩包包含两个关键文件:`jquery-ui-1.8.16.custom.min.js` 和 `jquery-ui-1.8.16.custom.css`,这些都是jQuery UI的特定版本,即1.8.16。这个版本在当时是一个广泛使用的稳定版本,提供了丰富的功能和组件。 ...

    jquery-ui-1.8.2.custom.min.js,jquery-ui-1.8.4.custom.css

    在实际项目中,`jquery-ui-1.8.2.custom.min.js`和`jquery-ui-1.8.4.custom.css`通常一起使用,以确保JavaScript组件的外观和行为与CSS样式协调一致。然而,需要注意的是,这两个版本相对较旧,可能不包含后来版本中...

    jquery-3.0.0.js 、jquery-3.0.0.min.js 【官方jquery包 js】

    二、`jquery-3.0.0.min.js`的优化 1. 文件大小:`.min.js`是经过压缩和混淆后的版本,文件大小显著减小,有利于提高页面加载速度,降低用户等待时间。 2. 代码优化:通过删除注释、合并变量、缩短函数名等手段,`....

    jquery-1.9.1.js 、jquery-1.9.1.min.js 【官方jquery包 js】

    `jquery-1.9.1.js`是未压缩的源代码版本,便于开发者阅读、调试和学习,而`jquery-1.9.1.min.js`是经过压缩和优化后的版本,体积更小,适用于生产环境,以提高页面加载速度。 jQuery 1.9.1版本是一个重要的里程碑,...

    jquery插件jquery-ui-1.8.18.custom.min.js及css文件

    在本篇文章中,我们将深入探讨其自定义版本 `jquery-ui-1.8.18.custom.min.js` 和相关的 CSS 文件,以理解它们如何协同工作,为网页带来强大的功能和美观的界面。 首先,`jquery-ui-1.8.18.custom.min.js` 是 ...

    jquery-1.11.3.js 、jquery-1.11.3.min.js 【官方jquery包 js】

    jQuery的`animate()`函数允许开发者创建自定义的动画效果,通过指定CSS属性的变化来实现平滑过渡。另外,`.fadeIn()`, `.slideUp()`, `.show()`, `.hide()`等预设动画则大大简化了常见的视觉效果。 5. **Ajax交互...

    jquery-1.11.1.js 、jquery-1.11.1.min.js 【官方jquery包 js】

    这个压缩包包含了两个版本的jQuery——`jquery-1.11.1.js`和`jquery-1.11.1.min.js`,它们都是官方发布的jQuery 1.11.1版本。这两个文件的主要区别在于,前者是未经压缩的源代码版本,方便开发者阅读和调试;后者则...

Global site tag (gtag.js) - Google Analytics