亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解Jquery實現ready和bind事件

2019-11-20 10:15:51
字體:
來源:轉載
供稿:網友

講這一節之前,先回顧之前一段代碼:

  (function (win) {      var _$ = function (selector, context) {        return new _$.prototype.Init(selector, context);      }      _$.prototype = {        Init: function (selector, context) {          this.elements = [];          var context = context || document;          if (context.querySelectorAll) {            var arr = context.querySelectorAll(selector);            for (var i = 0; i < arr.length; i++) {              this.elements.push(arr[i]);            }          }          ////這一塊是選擇器的實現,沒有寫完,可以自己實現        },        each: function (callback) {          if (this.elements.length > 0) {            for (var i = 0; i < this.elements.length; i++) {              callback.call(this, i, this.elements[i]);            }          }        }      }      _$.prototype.Init.prototype = _$.prototype;      window.$ = _$;    })(window || global);

上面我們實現了節點的查找,今天要講的是對節點的事件綁定。

熟悉Jquery 源碼的TX應該知道:我們上面的代碼少了ready事件,只是針對節點進行查詢,并沒有將document對象考慮進去。我之前單獨講過window.onload和 document. ready的區別,還對document.ready事件進行了擴展。

現在我們把擴展方法加到這里面:

我們的Init方法要改正一下:

 Init: function (selector, context) {          this.elements = [];          if (typeof selector === "function") {            this.elements.push(document);            this.ready(selector);          }          else {            var context = context || document;            var isDocument = function (ele) {              var tostring = Object.prototype.toString;              return tostring.call(ele) == "[object HTMLDocument]" || "[object Document]";            }            if (isDocument(selector)) {              this.elements.push(selector);            }            else if (context.querySelectorAll) {              var arr = context.querySelectorAll(selector);              for (var i = 0; i < arr.length; i++) {                this.elements.push(arr[i]);              }            }          }        }

這段代碼的大致意思是:如果傳入的參數selector是function類型,就執行ready事件。如果是document就將document對象插入到this.elements數組里面(這個傳入之后,會在ready事件里面進行判斷)。如果是字符竄,就查詢出節點,循環插入到this.elements數組里面,沒什么難度。主要考慮到$(document).ready和$(function(){})這兩種ready事件的寫法。

我們接下來把ready函數加進來:

  ready: function (callback) {          var isDocument = function (ele) {            var tostring = Object.prototype.toString;            return tostring.call(ele) == "[object HTMLDocument]" | "[object Document]";          }          if (isDocument(this.elements[0])) {            if (document.addEventListener) {              document.addEventListener('DOMContentLoaded', function () {                document.removeEventListener('DOMContentLoaded', arguments.callee, false);                callback();              }, false);            }            else if (document.attachEvent) {              document.attachEvent('onreadystatechange', function () {                if (document.readyState == "complete") {                  document.detachEvent('onreadystatechange', arguments.callee);                  callback();                }              });            }            else if (document.lastChild == document.body) {              callback();            }          }        }

這段代碼我之前其實講過了(onload和ready的區別),不知道的可以看看。

現在ready事件,我們實現了。然后就可以針對節點進行事件注冊了。

我們來實現bind函數,代碼如下:

 bind: function (type, callback) {          if (document.addEventListener) {            this.each(function (i, item) {              item.addEventListener(type, callback, false);            });          }          else if (document.attachEvent) {            this.each(function (i, item) {              item.attachEvent('on' + type, callback);            });          }          else {            this.each(function (i, item) {              tem['on' + type] = callback;            });          }        }

這里面都是些兼容性代碼,實現節點的事件注冊。之前的each,大家可能不知道是要干嘛的。現在在這里面就用到了。

主要作用是針對節點循環做一些操作。

完整代碼,來一份:

    (function (win) {      var _$ = function (selector, context) {        return new _$.prototype.Init(selector, context);      }      _$.prototype = {        Init: function (selector, context) {          this.elements = [];          if (typeof selector === "function") {            this.elements.push(document);            this.ready(selector);          }          else {            var context = context || document;            var isDocument = function (ele) {              var tostring = Object.prototype.toString;              return tostring.call(ele) == "[object HTMLDocument]" | "[object Document]";            }            if (isDocument(selector)) {              this.elements.push(selector);            }            else if (context.querySelectorAll) {              var arr = context.querySelectorAll(selector);              for (var i = 0; i < arr.length; i++) {                this.elements.push(arr[i]);              }            }          }        },        each: function (callback) {          var length = this.elements.length;          if (length > 0) {            for (var i = 0; i < length; i++) {              callback.call(this, i, this.elements[i]);            }          }        },        ready: function (callback) {          var isDocument = function (ele) {            var tostring = Object.prototype.toString;            return tostring.call(ele) == "[object HTMLDocument]" | "[object Document]";          }          if (isDocument(this.elements[0])) {            if (document.addEventListener) {              document.addEventListener('DOMContentLoaded', function () {                document.removeEventListener('DOMContentLoaded', arguments.callee, false);                callback();              }, false);            }            else if (document.attachEvent) {              document.attachEvent('onreadystatechange', function () {                if (document.readyState == "complete") {                  document.detachEvent('onreadystatechange', arguments.callee);                  callback();                }              });            }            else if (document.lastChild == document.body) {              callback();            }          }        },        bind: function (type, callback) {          if (document.addEventListener) {            this.each(function (i, item) {              item.addEventListener(type, callback, false);            });          }          else if (document.attachEvent) {            this.each(function (i, item) {              item.attachEvent('on' + type, callback);            });          }          else {            this.each(function (i, item) {              tem['on' + type] = callback;            });          }        }      }      _$.prototype.Init.prototype = _$.prototype;      window.$ = _$;    })(window);


這幾個函數基本上可以實現對節點的事件注冊了。其余的一些特效,還需要擴展。如果感興趣的話可以自己在  _$.prototype對象里面加方法。

以上就是本文的全部內容,希望能夠幫助大家。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲网| 国产综合在线观看视频| 91爱视频在线| 日本高清视频精品| 国产人妖伪娘一区91| 国产精品va在线| 欧美黑人性猛交| 国产日韩欧美自拍| 欧美高清视频免费观看| 精品国产一区二区三区四区在线观看| 国产在线视频2019最新视频| 最新69国产成人精品视频免费| 92福利视频午夜1000合集在线观看| 国产精品一区二区久久久| 精品久久久久人成| 欧美一区二区三区……| 国产在线精品一区免费香蕉| 国产一区二区美女视频| 欧美视频在线观看免费网址| 精品久久久久久久久久久| 91免费看片网站| 久久成人精品一区二区三区| 日韩美女免费线视频| 国产噜噜噜噜久久久久久久久| 日韩成人黄色av| 色偷偷91综合久久噜噜| 午夜精品久久17c| 美日韩精品免费视频| 91色p视频在线| 亚洲女人天堂av| 欧美精品videofree1080p| 亚洲精品电影网在线观看| 欧美国产日本在线| 91理论片午午论夜理片久久| 91热精品视频| 亚洲男人天堂网站| 欧美成人午夜免费视在线看片| 久热国产精品视频| 亚洲欧美成人一区二区在线电影| 亚洲天堂开心观看| 日韩日本欧美亚洲| 成人网页在线免费观看| 91综合免费在线| 国产精品福利在线| 国产视频在线观看一区二区| 国产福利成人在线| 91精品国产沙发| 国产精品99久久久久久久久久久久| 中日韩美女免费视频网址在线观看| 欧美极品少妇xxxxⅹ裸体艺术| www欧美日韩| 欧美日韩国产一中文字不卡| 国产美女久久精品香蕉69| 亚洲va电影大全| 97精品国产aⅴ7777| 中文字幕精品一区久久久久| 亚洲一区二区久久久久久久| 国产91精品久久久| 2019最新中文字幕| 日韩av在线免费观看| 国产精品亚洲精品| 欧美成人第一页| 成人高h视频在线| 国产精品网站大全| 日韩三级影视基地| 中文字幕欧美日韩精品| 欧美一区二区三区四区在线| 91精品视频在线播放| 亚洲无线码在线一区观看| 成人精品久久久| 国产一区视频在线| xxav国产精品美女主播| 亚洲97在线观看| 亚洲国产三级网| 亚洲国产精品va在线观看黑人| 久久精品视频网站| 97在线观看免费高清| 91国产在线精品| 欧美性黄网官网| 亚洲免费福利视频| 亚洲福利小视频| 国产69精品99久久久久久宅男| 欧美一区视频在线| 亚洲精品一区二三区不卡| 久久影视电视剧免费网站清宫辞电视| 日本道色综合久久影院| 国产精品一二三在线| 欧美激情网友自拍| 亚洲天堂视频在线观看| 亚洲精品aⅴ中文字幕乱码| 国产在线观看不卡| 国产精品你懂得| 欧美日韩午夜剧场| 日韩中文av在线| 亚洲跨种族黑人xxx| 日韩中文在线不卡| 精品久久久一区| 欧美猛交ⅹxxx乱大交视频| 欧美中文在线免费| 91精品国产电影| 98精品国产自产在线观看| 日韩欧美视频一区二区三区| 92看片淫黄大片欧美看国产片| 成人免费视频网| www日韩欧美| 欧美电影院免费观看| 亚洲伊人久久综合| 岛国视频午夜一区免费在线观看| 69视频在线播放| 美女视频黄免费的亚洲男人天堂| 国产精品视频999| 韩国精品久久久999| 欧美大尺度电影在线观看| 国产欧美一区二区三区久久| 中文字幕日韩免费视频| 日本不卡免费高清视频| 精品一区二区三区四区| 97福利一区二区| 欧美午夜精品久久久久久浪潮| 久久久av电影| 欧美中文字幕精品| 欧美性感美女h网站在线观看免费| 国产欧美精品日韩精品| 一本大道香蕉久在线播放29| 日韩欧美精品免费在线| 国产在线视频91| 久久夜色精品国产亚洲aⅴ| 国产成人免费av电影| 国产欧美精品日韩| 亚洲第一区第一页| 欧美日韩在线视频观看| 最近2019中文字幕一页二页| 中国日韩欧美久久久久久久久| 久久精品视频播放| 日韩av一区二区在线观看| 亚洲午夜女主播在线直播| 色www亚洲国产张柏芝| 91精品国产网站| 亚洲第一综合天堂另类专| 国内精品久久久久久中文字幕| 国产成人在线一区二区| 国产午夜精品全部视频播放| 日韩欧美在线视频| 国产精品久久久久久久久久| 日韩精品小视频| 国产在线一区二区三区| 亚洲日本成人网| 欧美视频裸体精品| 久久精品国产一区二区电影| 午夜精品一区二区三区在线| 亚洲精品日韩激情在线电影| 午夜精品久久久久久久久久久久| 日韩小视频在线| 国产亚洲精品美女久久久久| 欧美精品电影在线| 欧美成人一区二区三区电影| 性夜试看影院91社区| 精品视频—区二区三区免费| 日韩欧美亚洲成人| 欧美午夜丰满在线18影院| 欧美一区三区三区高中清蜜桃| 欧美丰满老妇厨房牲生活| 亚洲欧美国产日韩天堂区| 亚洲欧美精品一区二区|