美文网首页
zepto1.20源码简要分析(一)

zepto1.20源码简要分析(一)

作者: 谢志海 | 来源:发表于2016-07-21 15:10 被阅读269次

    前言

    中文API:http://www.css88.com/doc/zeptojs_api
    Zepto是一个小巧的dom操作库,非常适合研究源码。如果想不依赖此库的话,可以直接用里面的代码或查看以下文章:
    http://www.ruanyifeng.com/blog/2013/05/jquery-free.html

    结构

    Paste_Image.png

    整个库是一个Immediately-Invoked Function Expression (IIFE),核心部分是Zepto,主要包含dom树操作,到945行算结束了,之后是其他模块的初始化。

    入口

    所有功能即调用zepto.init

        // `$` will be the base `Zepto` object. When calling this
        // function just call `$.zepto.init, which makes the implementation
        // details of selecting nodes and creating Zepto collections
        // patchable in plugins.
        $ = function(selector, context){
          return zepto.init(selector, context)
        }
    

    最后返回给Zepto就是这个$

        // Export internal API functions in the `$.zepto` namespace
        zepto.uniq = uniq
        zepto.deserializeValue = deserializeValue
        $.zepto = zepto
    
        return $```
    ##zepto.init
    根据select的不同而更分发到不同的功能。主要包含字符串(css选择器)、function(文档加载时执行)和Z(Zepto模块)
    
    // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and
    // takes a CSS selector and an optional context (and handles various
    // special cases).
    // This method can be overridden in plugins.
    zepto.init = function(selector, context) {
      var dom
      // If nothing given, return an empty Zepto collection
      if (!selector) return zepto.Z()
      // Optimize for string selectors
      else if (typeof selector == 'string') {
        selector = selector.trim()
        // If it's a html fragment, create nodes from it
        // Note: In both Chrome 21 and Firefox 15, DOM error 12
        // is thrown if the fragment doesn't begin with <
        if (selector[0] == '<' && fragmentRE.test(selector))
          dom = zepto.fragment(selector, RegExp.$1, context), selector = null
        // If there's a context, create a collection on that context first, and select
        // nodes from there
        else if (context !== undefined) return $(context).find(selector)
        // If it's a CSS selector, use it to select nodes.
        else dom = zepto.qsa(document, selector)
      }
      // If a function is given, call it when the DOM is ready
      else if (isFunction(selector)) return $(document).ready(selector)
      // If a Zepto collection is given, just return it
      else if (zepto.isZ(selector)) return selector
      else {
        // normalize array if an array of nodes is given
        if (isArray(selector)) dom = compact(selector)
        // Wrap DOM nodes.
        else if (isObject(selector))
          dom = [selector], selector = null
        // If it's a html fragment, create nodes from it
        else if (fragmentRE.test(selector))
          dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null
        // If there's a context, create a collection on that context first, and select
        // nodes from there
        else if (context !== undefined) return $(context).find(selector)
        // And last but no least, if it's a CSS selector, use it to select nodes.
        else dom = zepto.qsa(document, selector)
      }
      // create a new Zepto collection from the nodes found
      return zepto.Z(dom, selector)
    }
    
    剩余部分为add、css、remove等dom操作的封装。

    相关文章

      网友评论

          本文标题:zepto1.20源码简要分析(一)

          本文链接:https://www.haomeiwen.com/subject/vvubjttx.html