国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

詳解Jquery實現(xiàn)ready和bind事件

2019-11-20 10:15:51
字體:
供稿:網(wǎng)友

講這一節(jié)之前,先回顧之前一段代碼:

  (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]);            }          }          ////這一塊是選擇器的實現(xiàn),沒有寫完,可以自己實現(xiàn)        },        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);

上面我們實現(xiàn)了節(jié)點的查找,今天要講的是對節(jié)點的事件綁定。

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

現(xiàn)在我們把擴展方法加到這里面:

我們的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]);              }            }          }        }

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

我們接下來把ready函數(shù)加進來:

  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的區(qū)別),不知道的可以看看。

現(xiàn)在ready事件,我們實現(xiàn)了。然后就可以針對節(jié)點進行事件注冊了。

我們來實現(xiàn)bind函數(shù),代碼如下:

 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;            });          }        }

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

主要作用是針對節(jié)點循環(huán)做一些操作。

完整代碼,來一份:

    (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);


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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 淮北市| 左云县| 额敏县| 滕州市| 江阴市| 湾仔区| 西宁市| 菏泽市| 襄垣县| 庆元县| 平顶山市| 东阿县| 罗江县| 西畴县| 咸宁市| 桂东县| 丰县| 千阳县| 丹江口市| 新源县| 南京市| 桂阳县| 郴州市| 伽师县| 肇源县| 乐业县| 会东县| 合水县| 玛多县| 德钦县| 隆德县| 防城港市| 钟祥市| 文登市| 濮阳县| 宁德市| 丰台区| 婺源县| 邛崃市| 志丹县| 荥经县|