成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Zepto源碼分析(一)核心代碼分析

BicycleWarrior / 1848人閱讀

摘要:源碼分析一核心代碼分析源碼分析二奇淫技巧總結(jié)本文只分析核心的部分代碼,并且在這部分代碼有刪減,但是不影響代碼的正常運行。當(dāng)長度為則不添加內(nèi)容,否則逐個將逐個到當(dāng)前實例新增直接返回一個新的構(gòu)造函數(shù)添加初始化方法。

Zepto源碼分析(一)核心代碼分析
Zepto源碼分析(二)奇淫技巧總結(jié)

本文只分析核心的部分代碼,并且在這部分代碼有刪減,但是不影響代碼的正常運行。

目錄

* 用閉包封裝Zepto
* 開始處理細(xì)節(jié)
* 正式處理數(shù)據(jù)(獲取選擇器選擇的DOM)
* 正式處理數(shù)據(jù)(添加DOM到當(dāng)前實例)
* 在實例的原型鏈上添加方法
* 支持插件擴(kuò)展
* 驗收

用閉包封裝Zepto

// 對全局暴露Zepto變量
var Zepto = (function() {

  // 定義$變量,并將具體細(xì)節(jié)交給zepto.init處理
  $ = function(selector, context){
    return zepto.init(selector, context)
  }

  // 返回變量
  return $
})()

// 把Zepto變量掛載在window
window.Zepto = Zepto
// 當(dāng)$變量沒有被占用的時候,為Zepto設(shè)置別名為$
window.$ === undefined && (window.$ = Zepto)

開始處理細(xì)節(jié)

// 對全局暴露Zepto變量
var Zepto = (function() {

  // [新增] 初始化zepto變量為對象
  var zepto = {}

  // [新增] 添加初始化方法。當(dāng)selector參數(shù)為空時,則交給zepto.Z()處理
  //        當(dāng)selector為字符串時則把zepto.qsa(document, selector)的值存到dom變量
  //        并且交給zepto.Z(dom, selector)處理
  zepto.init = function(selector, context) {
    var dom
    if (!selector) return zepto.Z()
    else if (typeof selector == "string") {
      dom = zepto.qsa(document, selector)
    }
    return zepto.Z(dom, selector)
  }

  // 定義$變量,并將具體細(xì)節(jié)交給zepto.init處理
  $ = function(selector, context){
    return zepto.init(selector, context)
  }

  // 返回變量
  return $
})()

// 把Zepto變量掛載在window
window.Zepto = Zepto
// 當(dāng)$變量沒有被占用的時候,為Zepto設(shè)置別名為$
window.$ === undefined && (window.$ = Zepto)

正式處理數(shù)據(jù)(獲取選擇器選擇的DOM)

// 對全局暴露Zepto變量
var Zepto = (function() {

  // 初始化zepto變量為對象
  var zepto = {}

  //  添加初始化方法。當(dāng)selector參數(shù)為空時,則交給zepto.Z()處理
  //  當(dāng)selector為字符串時則把zepto.qsa(document, selector)的值存到dom變量
  //  并且交給zepto.Z(dom, selector)處理
  zepto.init = function(selector, context) {
    var dom
    if (!selector) return zepto.Z()
    else if (typeof selector == "string") {
      dom = zepto.qsa(document, selector)
    }
    return zepto.Z(dom, selector)
  }

  // 定義$變量,并將具體細(xì)節(jié)交給zepto.init處理
  $ = function(selector, context){
    return zepto.init(selector, context)
  }

  // [新增] 使用querySelectorAll(selector)查詢DOM
  zepto.qsa = function(element, selector){
    return selector ? element.querySelectorAll(selector) : []
  }

  // 返回變量
  return $
})()

// 把Zepto變量掛載在window
window.Zepto = Zepto
// 當(dāng)$變量沒有被占用的時候,為Zepto設(shè)置別名為$
window.$ === undefined && (window.$ = Zepto)

正式處理數(shù)據(jù)(添加DOM到當(dāng)前實例)

// 對全局暴露Zepto變量
var Zepto = (function() {

  // 初始化zepto變量為對象
  var zepto = {}

  // [新增] 開始正式處理數(shù)據(jù)。當(dāng)dom長度為0則不添加內(nèi)容,
  //        否則逐個將dom逐個到當(dāng)前實例
  function Z(dom, selector) {
    var i, len = dom ? dom.length : 0
    for (i = 0; i < len; i++) this[i] = dom[i]
    this.length = len
    this.selector = selector || ""
  }

  // [新增] 直接返回一個新的構(gòu)造函數(shù)
  zepto.Z = function(dom, selector) {
    return new Z(dom, selector)
  }

  //  添加初始化方法。當(dāng)selector參數(shù)為空時,則交給zepto.Z()處理
  //  當(dāng)selector為字符串時則把zepto.qsa(document, selector)的值存到dom變量
  //  并且交給zepto.Z(dom, selector)處理
  zepto.init = function(selector, context) {
    var dom
    if (!selector) return zepto.Z()
    else if (typeof selector == "string") {
      dom = zepto.qsa(document, selector)
    }
    return zepto.Z(dom, selector)
  }

  // 定義$變量,并將具體細(xì)節(jié)交給zepto.init處理
  $ = function(selector, context){
    return zepto.init(selector, context)
  }

  // 使用querySelectorAll(selector)查詢DOM
  zepto.qsa = function(element, selector){
    return selector ? element.querySelectorAll(selector) : []
  }

  // 返回變量
  return $
})()

// 把Zepto變量掛載在window
window.Zepto = Zepto
// 當(dāng)$變量沒有被占用的時候,為Zepto設(shè)置別名為$
window.$ === undefined && (window.$ = Zepto)

在實例的原型鏈上添加方法

// 對全局暴露Zepto變量
var Zepto = (function() {

  // 初始化zepto變量為對象
  var zepto = {}, emptyArray = []

  // 開始正式處理數(shù)據(jù)。當(dāng)dom長度為0則不添加內(nèi)容,
  // 否則逐個將dom逐個到當(dāng)前實例
  function Z(dom, selector) {
    var i, len = dom ? dom.length : 0
    for (i = 0; i < len; i++) this[i] = dom[i]
    this.length = len
    this.selector = selector || ""
  }

  // 直接返回一個新的構(gòu)造函數(shù)
  zepto.Z = function(dom, selector) {
    return new Z(dom, selector)
  }

  //  添加初始化方法。當(dāng)selector參數(shù)為空時,則交給zepto.Z()處理
  //  當(dāng)selector為字符串時則把zepto.qsa(document, selector)的值存到dom變量
  //  并且交給zepto.Z(dom, selector)處理
  zepto.init = function(selector, context) {
    var dom
    if (!selector) return zepto.Z()
    else if (typeof selector == "string") {
      dom = zepto.qsa(document, selector)
    }
    return zepto.Z(dom, selector)
  }

  // 定義$變量,并將具體細(xì)節(jié)交給zepto.init處理
  $ = function(selector, context){
    return zepto.init(selector, context)
  }

  // 使用querySelectorAll(selector)查詢DOM
  zepto.qsa = function(element, selector){
    return selector ? element.querySelectorAll(selector) : []
  }

  // [新增] 定義each方法
  $.each = function(elements, callback){
    var i, key
    if (likeArray(elements)) {
      for (i = 0; i < elements.length; i++)
        if (callback.call(elements[i], i, elements[i]) === false) return elements
    } else {
      for (key in elements)
        if (callback.call(elements[key], key, elements[key]) === false) return elements
    }

    return elements
  }

  // [新增] 定義用于擴(kuò)展在原型鏈上的方法
  $.fn = {
    constructor: zepto.Z,
    length: 0,
    each: function(callback){
      emptyArray.every.call(this, function(el, idx){
        return callback.call(el, idx, el) !== false
      })
      return this
    },
    empty: function(){
      return this.each(function(){ this.innerHTML = "" })
    },
    html: function(html){
      return 0 in arguments ?
        this.each(function(idx){
          var originHtml = this.innerHTML
          $(this).empty().append( funcArg(this, html, idx, originHtml) )
        }) :
        (0 in this ? this[0].innerHTML : null)
    },
    test : function(){
      return this.each(function(){
        console.log("測試鏈?zhǔn)秸{(diào)用")
        return this 
      })
    }
  }

  // [新增] 原型鏈指向$.fn
  zepto.Z.prototype = Z.prototype = $.fn
  // $.zepto指向zepto
  $.zepto = zepto

  // 返回變量
  return $
})()

// 把Zepto變量掛載在window
window.Zepto = Zepto
// 當(dāng)$變量沒有被占用的時候,為Zepto設(shè)置別名為$
window.$ === undefined && (window.$ = Zepto)

支持插件擴(kuò)展

// 對全局暴露Zepto變量
var Zepto = (function() {

  // 初始化zepto變量為對象
  var zepto = {}, emptyArray = []

  // 開始正式處理數(shù)據(jù)。當(dāng)dom長度為0則不添加內(nèi)容,
  // 否則逐個將dom逐個到當(dāng)前實例
  function Z(dom, selector) {
    var i, len = dom ? dom.length : 0
    for (i = 0; i < len; i++) this[i] = dom[i]
    this.length = len
    this.selector = selector || ""
  }

  // 直接返回一個新的構(gòu)造函數(shù)
  zepto.Z = function(dom, selector) {
    return new Z(dom, selector)
  }

  //  添加初始化方法。當(dāng)selector參數(shù)為空時,則交給zepto.Z()處理
  //  當(dāng)selector為字符串時則把zepto.qsa(document, selector)的值存到dom變量
  //  并且交給zepto.Z(dom, selector)處理
  zepto.init = function(selector, context) {
    var dom
    if (!selector) return zepto.Z()
    else if (typeof selector == "string") {
      dom = zepto.qsa(document, selector)
    }
    return zepto.Z(dom, selector)
  }

  // 定義$變量,并將具體細(xì)節(jié)交給zepto.init處理
  $ = function(selector, context){
    return zepto.init(selector, context)
  }

  // [新增] 插件擴(kuò)展函數(shù)
  function extend(target, source, deep) {
    for (key in source)
      if (source[key] !== undefined) target[key] = source[key]
  }

  // [新增] 插件擴(kuò)展函數(shù)
  $.extend = function(target){
    var deep, args = emptyArray.slice.call(arguments, 1)
    if (typeof target == "boolean") {
      deep = target
      target = args.shift()
    }
    args.forEach(function(arg){ extend(target, arg, deep) })
    return target
  }

  // 使用querySelectorAll(selector)查詢DOM
  zepto.qsa = function(element, selector){
    return selector ? element.querySelectorAll(selector) : []
  }

  // 定義each方法
  $.each = function(elements, callback){
    var i, key
    if (likeArray(elements)) {
      for (i = 0; i < elements.length; i++)
        if (callback.call(elements[i], i, elements[i]) === false) return elements
    } else {
      for (key in elements)
        if (callback.call(elements[key], key, elements[key]) === false) return elements
    }

    return elements
  }

  // 定義用于擴(kuò)展在原型鏈上的方法
  $.fn = {
    constructor: zepto.Z,
    length: 0,
    each: function(callback){
      emptyArray.every.call(this, function(el, idx){
        return callback.call(el, idx, el) !== false
      })
      return this
    },
    empty: function(){
      return this.each(function(){ this.innerHTML = "" })
    },
    html: function(html){
      return 0 in arguments ?
        this.each(function(idx){
          var originHtml = this.innerHTML
          $(this).empty().append( funcArg(this, html, idx, originHtml) )
        }) :
        (0 in this ? this[0].innerHTML : null)
    },
    test : function(){
      return this.each(function(){
        console.log("測試鏈?zhǔn)秸{(diào)用")
        return this 
      })
    }
  }

  // 原型鏈指向$.fn
  zepto.Z.prototype = Z.prototype = $.fn
  // $.zepto指向zepto
  $.zepto = zepto

  // 返回變量
  return $
})()

// 把Zepto變量掛載在window
window.Zepto = Zepto
// 當(dāng)$變量沒有被占用的時候,為Zepto設(shè)置別名為$
window.$ === undefined && (window.$ = Zepto)

驗收

// 鏈?zhǔn)秸{(diào)用測試
$("head").test().test()  // 測試鏈?zhǔn)秸{(diào)用
測試鏈?zhǔn)秸{(diào)用
{0: head, length: 1, selector: "head"}
$("head").html()  // 

歡迎關(guān)注前端進(jìn)階指南微信公眾號:

另外我也創(chuàng)了一個對應(yīng)的QQ群:660112451,歡迎一起交流。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/84926.html

相關(guān)文章

  • Zepto 源碼分析 4 - 核心模塊入口

    摘要:對象構(gòu)造函數(shù)讀入的兩個參數(shù)與在中也有明確的規(guī)范,用以保證構(gòu)造函數(shù)的簡單性。 承接第三篇末尾內(nèi)容,本篇結(jié)合官方 API 進(jìn)入對 Zepto 核心的分析,開始難度會比較大,需要重點理解幾個核心對象的關(guān)系,方能找到線索。 $() 與 Z 對象創(chuàng)建 Zepto Core API 的首個方法 $() 按照其官方解釋: Create a Zepto collection object by pe...

    xzavier 評論0 收藏0
  • Zepto 源碼分析 1 - 進(jìn)入 Zepto

    摘要:選擇的理由是一個用于現(xiàn)代瀏覽器的與大體兼容的庫。環(huán)境搭建分析環(huán)境的搭建僅需要一個常規(guī)頁面和原始代碼一個常規(guī)頁面打開的首頁即可,在開發(fā)人員工具中即可使用原始代碼本篇分析的代碼參照,進(jìn)入該代碼分支中即可。 選擇 Zepto 的理由 Zepto is a minimalist JavaScript library for modern browsers with a largely jQue...

    Aklman 評論0 收藏0
  • Zepto源碼代碼結(jié)構(gòu)

    摘要:源碼結(jié)構(gòu)整體結(jié)構(gòu)如果在編輯器中將的源碼折疊起來,看到的就跟上面的代碼一樣。參考源碼分析代碼結(jié)構(gòu)對象思想與源碼分析設(shè)計和源碼分析源碼中關(guān)于的問題最后,所有文章都會同步發(fā)送到微信公眾號上,歡迎關(guān)注歡迎提意見 雖然最近工作中沒有怎么用 zepto ,但是據(jù)說 zepto 的源碼比較簡單,而且網(wǎng)上的資料也比較多,所以我就挑了 zepto 下手,希望能為以后閱讀其他框架的源碼打下基礎(chǔ)吧。 源碼版...

    warkiz 評論0 收藏0
  • zepto源碼分析-代碼結(jié)構(gòu)

    摘要:本來想學(xué)習(xí)一下的源碼,但由于的源碼有多行,設(shè)計相當(dāng)復(fù)雜,所以決定從開始,分析一個成熟的框架的代碼結(jié)構(gòu)及執(zhí)行步驟。同時發(fā)表在我的博客源碼分析代碼結(jié)構(gòu) 本來想學(xué)習(xí)一下jQuery的源碼,但由于jQuery的源碼有10000多行,設(shè)計相當(dāng)復(fù)雜,所以決定從zepto開始,分析一個成熟的框架的代碼結(jié)構(gòu)及執(zhí)行步驟。 網(wǎng)上也有很多zepto的源碼分析,有的給源碼添加注釋,有的談與jQuery的不同,...

    sherlock221 評論0 收藏0
  • Zepto 源碼分析 3 - qsa 實現(xiàn)與工具函數(shù)設(shè)計

    摘要:承接第一篇末尾內(nèi)容,本部分開始進(jìn)入主模塊,分析其設(shè)計思路與實現(xiàn)技巧下文代碼均進(jìn)行過重格式化,但代碼版本同第一部分內(nèi)容且入口函數(shù)不變的選擇器先從第一個與原型鏈構(gòu)造不直接相關(guān)的工具函數(shù)說起,觀察的設(shè)計思路。 承接第一篇末尾內(nèi)容,本部分開始進(jìn)入 zepto 主模塊,分析其設(shè)計思路與實現(xiàn)技巧(下文代碼均進(jìn)行過重格式化,但代碼 Commit 版本同第一部分內(nèi)容且入口函數(shù)不變): Zepto 的選...

    ctriptech 評論0 收藏0

發(fā)表評論

0條評論

BicycleWarrior

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<