<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • jQuery 源碼分析和Ready函數

    時間:2024-06-28 02:10:16 jQuery 我要投稿
    • 相關推薦

    jQuery 源碼分析和Ready函數

      這個功能在 jQuery的文檔中提到了三種等價的形式:

      復制代碼 代碼如下:

      // 定義在jQuery.fn.ready

      $(document).ready(handler);

      // 和上一個是同一個,不推薦

      $().ready(handler);

      // 單獨在jQuery對象中處理

      $(handler);

      // 以上這個形式的定義:

      if(jQuery.isFunction(selector) {

      return rootjQuery.ready(selector);

      }

      因此實際上都歸結與一個形式:jQuery.fn.ready(fn)。定義如下:

      復制代碼 代碼如下:

      ready: function(fn) {

      // 綁定事件到DOM上

      jQuery.bindReady();

      // 觸發回調函數

      readyList.done(fn);

      // 返回jQuery對象

      return this;

      }

      實際上jQuery內部并不僅僅只有一個對fn的引用。這里用到了 Deferred功能。在75行,為jQuery對象定義了readyList成員。而在442行在bindReady函數中初始化了這個變量:

      復制代碼 代碼如下:

      if(readyList) {

      return;

      }

      readyList = jQuery._Deferred();

      bindReady函數除了初始化readyList之外,主要處理了瀏覽器對于綁定事件的區別。IE使用attachEvent而其他瀏覽器使用addEventHandler。這兩個步驟完成后,ready函數使用readyList.resolveWith 觸發回調函數。除了這個工作外,ready還處理了holdReady。這個API 的作用是延遲ready事件的回調,主要目的是在ready事件前做點事情。holdReady設置了一個標志位readyWait。當這個標志位被設置之后,ready在調用readyList.resolveWith之前不停地調用setTimeout(jQuery.ready, 1)。即每隔固定時間就遞歸調用自己(不知道hold時間久了,js引擎會不會棧溢出),這樣最后被holdReady釋放的時候, setTimeout會沿著調用棧回來的。為了在這個棧完成之前不觸發ready回調函數。在每次調用setTimeout的時候,會遞增readyWait變量。用來指示被holdReady函數延誤了幾次調用。

      ###幾個基礎輔助函數

      在543行開始,定義了幾個值得注意的輔助函數:parseJSON,parseXML和globalEval。parseJSON把一個字符串變成JSON對象。我們一般使用的是eval。parseJSON封裝了這個操作,但是eval被當作了最后手段。因為最新JavaScript標準中加入了JSON序列化和反序列化的API。如果瀏覽器支持這個標準,則這兩個API是在JS引擎中用Native Code實現的,效率肯定比eval高很多。目前來看,Chrome和Firefox4都支持這個API。parseJSON使用如下:

      復制代碼 代碼如下:

      // 原生JSON API。反序列化是JSON.stringify(object)

      if(window.JSON && window.JSON.parse) {

      return window.JSON.parse(data);

      }

      // ... 大致地檢查一下字符串合法性

      return (new Function("return " + data))();

      parseXML函數也主要是標準API和IE的封裝。標準API是DOMParser對象。而IE使用的是Microsoft.XMLDOM的 ActiveXObject對象。定義:

      復制代碼 代碼如下:

      if(window.DOMParser) {

      tmp = new DOMParser();

      xml = tmp.parseFromString(data, "text/xml");

      } else {

      xml = new ActiveXObject("Microsoft.XMLDOM");

      xml.async = "false";

      xml.loadXML(data);

      }

      globalEval函數把一段腳本加載到全局context中。IE中可以使用window.execScript。其他瀏覽器需要使用eval。因為整個jQuery代碼都是一整個匿名函數,所以當前context是jQuery。主要代碼:

      復制代碼 代碼如下:

      (window.execScript || function(data) {

      window["eval"].call(window, data); // 在window context下運行

      })(data);

    【jQuery 源碼分析和Ready函數】相關文章:

    淺析jQuery 遍歷函數javascript03-29

    Javascript函數的定義和用法分析03-31

    jQuery中parent()和siblings()的問題03-29

    PHP中的排序函數區別分析03-31

    jquery提交按鈕的代碼03-30

    jQuery程序設計03-30

    jquery之超簡單的div顯示和隱藏特效demo簡介03-29

    如何理解jquery事件冒泡03-29

    jQuery的DOM操作筆記03-29

    主站蜘蛛池模板: 久久无码精品一区二区三区| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 亚洲国产精品一区二区三区久久 | 亚洲AV日韩精品久久久久久久| 亚洲国产成人久久精品影视| 久久久久人妻精品一区| 热综合一本伊人久久精品| 51精品资源视频在线播放 | 国产精品午夜久久| 999久久久免费精品国产| 亚洲欧美日韩国产精品专区 | 91精品成人免费国产| 亚洲欧美日韩久久精品第一区| 久久精品视频91| 99九九精品免费视频观看| 国产精品一区二区不卡| 日本内射精品一区二区视频| 久久精品一区二区三区中文字幕 | 成人免费精品网站在线观看影片 | 无码国内精品久久人妻麻豆按摩 | 国产精品99久久久久久董美香 | 国产精品igao视频| 欧美日韩精品一区二区| jiucao在线观看精品| 久久99国产综合精品免费| 午夜精品久久久久久中宇| 亚洲精品无码专区2| 亚洲国产午夜中文字幕精品黄网站 | 亚洲国产精品嫩草影院在线观看| 精品无码人妻一区二区三区不卡| 一本大道久久a久久精品综合| 国产精品亚洲午夜一区二区三区| 国产精品亲子乱子伦xxxx裸| 久久久久99精品成人片欧美| 嫖妓丰满肥熟妇在线精品| 午夜精品一区二区三区免费视频 | 特级精品毛片免费观看| 亚洲精品国偷自产在线| 亚洲国产美女精品久久久久∴| 亚洲AⅤ永久无码精品AA| 亚洲av午夜精品一区二区三区 |