欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年04月14日 15:50:23   作者:香草檸檬  
這篇文章主要為大家詳細介紹了Jquery實現(xiàn)ready和bind事件的相關(guān)資料,感興趣的小伙伴們可以參考一下

講這一節(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)容,希望能夠幫助大家。

相關(guān)文章

  • JS 遍歷 json 和 JQuery 遍歷json操作完整示例

    JS 遍歷 json 和 JQuery 遍歷json操作完整示例

    這篇文章主要介紹了JS 遍歷 json 和 JQuery 遍歷json操作,結(jié)合完整實例形式詳細分析了JavaScript與jQuery遍歷json格式數(shù)據(jù)的簡單實現(xiàn)技巧,需要的朋友可以參考下
    2019-11-11
  • jQuery中的deferred使用方法

    jQuery中的deferred使用方法

    deferred對象是jQuery的回調(diào)函數(shù)解決方案,jQuery之前的版本中異步回調(diào)這塊做的不是很好,所以后期補上了該解決方案。接下來通過本文給大家介紹jQuery中的derferred使用方法,非常不錯,需要的朋友參考下
    2017-03-03
  • jQuery技巧大放送 學習jquery的朋友可以看下

    jQuery技巧大放送 學習jquery的朋友可以看下

    jQuery技巧大放送 學習jquery的朋友可以看下,非常不錯的整理,推薦。
    2009-10-10
  • jquery URL參數(shù)判斷,確定菜單樣式

    jquery URL參數(shù)判斷,確定菜單樣式

    jquery URL判斷,確定菜單樣式,需要的朋友可以參考下,當然js也可以的??梢詤⒖枷孪嚓P(guān)文章。
    2010-05-05
  • jquery.boxy彈出框(后隔N秒后自動隱藏/自動跳轉(zhuǎn))

    jquery.boxy彈出框(后隔N秒后自動隱藏/自動跳轉(zhuǎn))

    對于 Boxy彈出框的使用之前寫過一些文章(查看jquery.boxy基礎(chǔ)),今天主要是在解決一個需要之后,覺得值得把它記錄下來,所以就再寫一篇,主要功能是,在彈出對話框后,隔N秒后自動隱藏,還有就是自動跳轉(zhuǎn)
    2013-01-01
  • jQuery右下角懸浮廣告實例

    jQuery右下角懸浮廣告實例

    現(xiàn)在很多網(wǎng)站都有懸浮廣告,本篇文章主要介紹了jQuery右下角懸浮廣告,非常具有實用效果,有需要的朋友可以來參考一下。
    2016-10-10
  • jQuery列表拖動排列具體實現(xiàn)

    jQuery列表拖動排列具體實現(xiàn)

    列表拖動排列的實現(xiàn)方法有很多,下文為大家介紹下使用jQuery是如何實現(xiàn)的,感興趣的朋友不要錯過
    2013-11-11
  • jQuery實現(xiàn)新消息閃爍標題提示的方法

    jQuery實現(xiàn)新消息閃爍標題提示的方法

    這篇文章主要介紹了jQuery實現(xiàn)新消息閃爍標題提示的方法,實例分析了jQuery操作樣式的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • jQuery實現(xiàn)移動端滑塊拖動選擇數(shù)字效果

    jQuery實現(xiàn)移動端滑塊拖動選擇數(shù)字效果

    這篇文章主要介紹了jQuery實現(xiàn)移動端滑塊拖動選擇數(shù)字效果,jQuery實現(xiàn)移動端滑塊拖動效果,感興趣的小伙伴們可以參考一下
    2015-12-12
  • jquery 簡單的title顯示插件

    jquery 簡單的title顯示插件

    這個代碼,針對學習jquery插件制作的朋友可以參考下。效果并不是主要的。
    2010-05-05

最新評論