詳解Jquery實現(xiàn)ready和bind事件
講這一節(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,大家可能不知道是要干嘛的?,F(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)容,希望能夠幫助大家。
- jQuery學習筆記 操作jQuery對象 文檔處理
- Jquery 基礎(chǔ)學習筆記之文檔處理
- jquery中ready()函數(shù)執(zhí)行的時機和window的load事件比較
- jquery $(document).ready()和window.onload的區(qū)別淺析
- jQuery中ready事件用法實例
- jQuery.holdReady()方法用法實例
- jQuery的ready方法詳解
- jquery中的$(document).ready()使用小結(jié)
- Jquery中"$(document).ready(function(){ })"函數(shù)的使用詳解
- JQuery的ready函數(shù)與JS的onload的區(qū)別詳解
- 模擬jQuery中的ready方法及實現(xiàn)按需加載css,js實例代碼
- jQuery的文檔處理程序詳解
相關(guān)文章
JS 遍歷 json 和 JQuery 遍歷json操作完整示例
這篇文章主要介紹了JS 遍歷 json 和 JQuery 遍歷json操作,結(jié)合完整實例形式詳細分析了JavaScript與jQuery遍歷json格式數(shù)據(jù)的簡單實現(xiàn)技巧,需要的朋友可以參考下2019-11-11jquery.boxy彈出框(后隔N秒后自動隱藏/自動跳轉(zhuǎn))
對于 Boxy彈出框的使用之前寫過一些文章(查看jquery.boxy基礎(chǔ)),今天主要是在解決一個需要之后,覺得值得把它記錄下來,所以就再寫一篇,主要功能是,在彈出對話框后,隔N秒后自動隱藏,還有就是自動跳轉(zhuǎn)2013-01-01jQuery實現(xiàn)移動端滑塊拖動選擇數(shù)字效果
這篇文章主要介紹了jQuery實現(xiàn)移動端滑塊拖動選擇數(shù)字效果,jQuery實現(xiàn)移動端滑塊拖動效果,感興趣的小伙伴們可以參考一下2015-12-12