亚洲国产日韩欧美在线a乱码,国产精品路线1路线2路线,亚洲视频一区,精品国产自,www狠狠,国产情侣激情在线视频免费看,亚洲成年网站在线观看

jQuery 源碼分析和Ready函數(shù)

時(shí)間:2023-03-29 19:55:15 jQuery 我要投稿
  • 相關(guān)推薦

jQuery 源碼分析和Ready函數(shù)

  這個(gè)功能在 jQuery的文檔中提到了三種等價(jià)的形式:

  復(fù)制代碼 代碼如下:

  // 定義在jQuery.fn.ready

  $(document).ready(handler);

  // 和上一個(gè)是同一個(gè),不推薦

  $().ready(handler);

  // 單獨(dú)在jQuery對(duì)象中處理

  $(handler);

  // 以上這個(gè)形式的定義:

  if(jQuery.isFunction(selector) {

  return rootjQuery.ready(selector);

  }

  因此實(shí)際上都?xì)w結(jié)與一個(gè)形式:jQuery.fn.ready(fn)。定義如下:

  復(fù)制代碼 代碼如下:

  ready: function(fn) {

  // 綁定事件到DOM上

  jQuery.bindReady();

  // 觸發(fā)回調(diào)函數(shù)

  readyList.done(fn);

  // 返回jQuery對(duì)象

  return this;

  }

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

  復(fù)制代碼 代碼如下:

  if(readyList) {

  return;

  }

  readyList = jQuery._Deferred();

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

  ###幾個(gè)基礎(chǔ)輔助函數(shù)

  在543行開始,定義了幾個(gè)值得注意的輔助函數(shù):parseJSON,parseXML和globalEval。parseJSON把一個(gè)字符串變成JSON對(duì)象。我們一般使用的是eval。parseJSON封裝了這個(gè)操作,但是eval被當(dāng)作了最后手段。因?yàn)樽钚翵avaScript標(biāo)準(zhǔn)中加入了JSON序列化和反序列化的API。如果瀏覽器支持這個(gè)標(biāo)準(zhǔn),則這兩個(gè)API是在JS引擎中用Native Code實(shí)現(xiàn)的,效率肯定比eval高很多。目前來看,Chrome和Firefox4都支持這個(gè)API。parseJSON使用如下:

  復(fù)制代碼 代碼如下:

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

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

  return window.JSON.parse(data);

  }

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

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

  parseXML函數(shù)也主要是標(biāo)準(zhǔn)API和IE的封裝。標(biāo)準(zhǔn)API是DOMParser對(duì)象。而IE使用的是Microsoft.XMLDOM的 ActiveXObject對(duì)象。定義:

  復(fù)制代碼 代碼如下:

  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函數(shù)把一段腳本加載到全局context中。IE中可以使用window.execScript。其他瀏覽器需要使用eval。因?yàn)檎麄(gè)jQuery代碼都是一整個(gè)匿名函數(shù),所以當(dāng)前context是jQuery。主要代碼:

  復(fù)制代碼 代碼如下:

  (window.execScript || function(data) {

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

  })(data);

【jQuery 源碼分析和Ready函數(shù)】相關(guān)文章:

JQuery EasyUI教程06-20

我學(xué)習(xí)jquery的經(jīng)驗(yàn)06-21

JQuery系列教程講解06-20

反比例函數(shù)的圖像和性質(zhì)教案(精選8篇)05-15

唱歌技巧和發(fā)聲方法分析07-31

網(wǎng)球運(yùn)動(dòng)步法分析和訓(xùn)練05-30

管理的跨度和層次適當(dāng)分析技巧09-05

靜定結(jié)構(gòu)受力分析和特性06-21

分析小升初選擇直升的優(yōu)勢(shì)和劣勢(shì)08-13

小升初選擇直升的優(yōu)勢(shì)和劣勢(shì)分析09-12