一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

jQuery.event自定義事件機制

 太羊967 2016-06-12

什么時候要用到自定義函數(shù)?有些瀏覽器并不兼容某類型的事件,如IE6~8不支持hashchange事件,你無法通過jQuery(window).bind('hashchange', callback)來綁定這個事件,這個時候你就可以通過jQuery自定義事件接口來模擬這個事件,做到跨瀏覽器兼容


原理


jQuery(elem).bind(type, callbakc)實際上是映射到 jQuery.event.add(elem, types, handler, data)這個方法,每一個類型的事件會初始化一次事件處理器,而傳入的回調(diào)函數(shù)會以數(shù)組的方式緩存起來,當事件觸發(fā)的時候處理器將依次執(zhí)行這個數(shù)組。

jQuery.event.add方法在第一次初始化處理器的時候會檢查是否為自定義事件,如果存在則將會把控制權(quán)限交給自定義事件的事件初始化函數(shù),同樣事件卸載的jQuery.event.remove方法在刪除處理器前也會檢查此。


如jQuery源碼:

初始化處事件處理器

[javascript] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
  1. // Check for a special event handler  
  2. // Only use addEventListener/attachEvent if the special  
  3. // events handler returns false  
  4. if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {  
  5.         // Bind the global event handler to the element  
  6.         if ( elem.addEventListener ) {  
  7.                 elem.addEventListener( type, eventHandle, false );  
  8.   
  9.         } else if ( elem.attachEvent ) {  
  10.                 elem.attachEvent( "on" + type, eventHandle );  
  11.         }  
  12. }  



卸載處理器:

[javascript] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
  1. if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {  
  2.         jQuery.removeEvent( elem, type, elemData.handle );  
  3. }  




入口


[javascript] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
  1. <pre name="code" class="javascript">jQuery.event.special[youEvent] = {  
  2.         /** 
  3.          * 初始化事件處理器 - this指向元素 
  4.          * @param 附加的數(shù)據(jù) 
  5.          * @param 事件類型命名空間 
  6.          * @param 回調(diào)函數(shù) 
  7.          */  
  8.         setup: function (data, namespaces, eventHandle) {  
  9.         },  
  10.         /** 
  11.          * 卸載事件處理器 - this指向元素 
  12.          * @param 事件類型命名空間 
  13.          */  
  14.         teardown: function (namespaces) {  
  15.         }  
  16. };  






事實上jQuery自定義事件那些接收的參數(shù)有點雞肋,需要hack與能hack的事件就那么一點點,且限制頗多,一般情況下很少使用到。

接下來我們做一個最簡單的自定義插件,給jQuery提供input跨瀏覽器事件支持。input事件不同于keydown與keyup,它不依賴鍵盤響應,只要值改變都會觸發(fā)input事件,比如粘貼文字、使用在線軟鍵盤等。


范例


[javascript] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
  1. /* 
  2. * jQuery input event 
  3. * Author: tangbin 
  4. * Blog: http://www. 
  5. * Date: 2011-08-18 15:15 
  6. */  
  7. (function ($) {  
  8.   
  9. // IE6\7\8不支持input事件,但支持propertychange事件  
  10. if ('onpropertychange' in document) {  
  11.         // 檢查是否為可輸入元素  
  12.         var rinput = /^INPUT|TEXTAREA$/,  
  13.                 isInput = function (elem) {  
  14.                         return rinput.test(elem.nodeName);  
  15.                 };  
  16.                   
  17.         $.event.special.input = {  
  18.                 setup: function () {  
  19.                         var elem = this;  
  20.                         if (!isInput(elem)) return false;  
  21.                           
  22.                         $.data(elem, '@oldValue', elem.value);  
  23.                         $.event.add(elem, 'propertychange'function (event) {  
  24.                                 // 元素屬性任何變化都會觸發(fā)propertychange事件  
  25.                                 // 需要屏蔽掉非value的改變,以便接近標準的onput事件  
  26.                                 if ($.data(this'@oldValue') !== this.value) {  
  27.                                         $.event.trigger('input'nullthis);  
  28.                                 };  
  29.                                   
  30.                                 $.data(this'@oldValue'this.value);  
  31.                         });  
  32.                 },  
  33.                 teardown: function () {  
  34.                         var elem = this;  
  35.                         if (!isInput(elem)) return false;  
  36.                         $.event.remove(elem, 'propertychange');  
  37.                         $.removeData(elem, '@oldValue');  
  38.                 }  
  39.         };  
  40. };  
  41.   
  42. // 聲明快捷方式:$(elem).input(function () {});  
  43. $.fn.input = function (callback) {  
  44.         return this.bind('input', callback);  
  45. };  
  46.   
  47. })(jQuery);  




調(diào)用:

[javascript] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
  1. jQuery(elem).bind('input'function () {}); 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩成人h视频在线观看| 国产欧美亚洲精品自拍| 欧洲日韩精品一区二区三区| 国产传媒免费观看视频| 亚洲一区二区福利在线| 亚洲天堂有码中文字幕视频| 日韩在线免费看中文字幕| 日本高清不卡在线一区| 东京热男人的天堂一二三区 | 又色又爽又黄的三级视频| 日本本亚洲三级在线播放| 91日韩欧美国产视频| 欧美午夜一级特黄大片| 欧美视频在线观看一区| 一区二区三区国产日韩| 欧美一区二区三区视频区| 中文字幕亚洲视频一区二区| 亚洲中文字幕亲近伦片| 国产午夜精品久久福利| 欧美日韩国产免费看黄片| 日本不卡一区视频欧美| 日韩人妻免费视频一专区| 日系韩系还是欧美久久| 国产精品午夜性色视频| 好吊日视频这里都是精品| 中文字幕亚洲在线一区| 东京热男人的天堂一二三区| 国产不卡免费高清视频| 暴力三级a特黄在线观看| 久久精品a毛片看国产成人| 久久精品少妇内射毛片| 国产视频在线一区二区| 国产成人精品国产亚洲欧洲| 高清在线精品一区二区| 国产午夜福利片在线观看| 97人妻精品一区二区三区免| 亚洲中文字幕高清视频在线观看 | 亚洲妇女黄色三级视频| 欧美午夜不卡在线观看| 熟女少妇久久一区二区三区| 又黄又硬又爽又色的视频|