美文网首页zeptoJavaScript 进阶营
Zepto源码分析之ie模块

Zepto源码分析之ie模块

作者: 谦龙 | 来源:发表于2017-11-03 23:20 被阅读5次

    前言

    Zepto中的ie模块主要是改写getComputedStyle浏览器API,代码量很少,但也是其重要模块之一。在看源代码之前,我们先回顾一下如何使用

    getComputedStyle

    Window.getComputedStyle() 方法给出应用活动样式表后的元素的所有CSS属性的值,并解析这些值可能包含的任何基本计算。MDN

    
    let style = window.getComputedStyle(element, [pseudoElt]);
    
    
    

    element

    element参数即是我们要获取样式的元素

    pseudoElt

    要匹配的伪元素字符串,对于普通元素来说需省略(null)

    结果

    特别重要的是该方法执行后返回的样式是一个实时的 CSSStyleDeclaration 对象,当元素的样式更改时,它会自动更新本身。

    <style>
     #elem{
       position: absolute;
       left: 100px;
       top: 200px;
       height: 100px;
     }
    </style>
    
    <div id="elem">dummy</div>
    
    
    
    let $elem = document.querySelector('#elem')
    let cssProps = getComputedStyle($elem, null)
    
    let { width, height } = cssProps
    console.log(width, height)
    

    特别注意

    第一个参数必须是Element对象(传递一个非节点元素,如 一个#text 节点, 将会抛出一个错误)MDN,这也可能是Zepto要重写它的原因吧

    源码分析

    ;(function(){
      // getComputedStyle shouldn't freak out when called
      // without a valid element as argument
      // 重写getComputedStyle
      // 第一个参数如果不是元素节点则会抛出错误,被catch捕获,并被重写。
      // 重写后的方法,如果传入的第一个参数不是元素节点,被catch捕获,返回null,则不影响后续代码的运行
      try {
        getComputedStyle(undefined)
      } catch(e) {
        var nativeGetComputedStyle = getComputedStyle
        window.getComputedStyle = function(element, pseudoElement){
          try {
            return nativeGetComputedStyle(element, pseudoElement)
          } catch(e) {
            return null
          }
        }
      }
    })()
    
    

    代码非常简单,浏览器在加载该模块的时候,如果调用getComputedStyle第一个参数不为元素节点时抛出错误,则被catch捕获,并重写该方法。重写的方法中是另一个try catch,如果后续再�发生错误,将返回null,不阻碍后续js代码的执行。

    结尾

    以上便是�Zepto ie模块的源码分析的全部,欢迎提出意见和建议。

    文章记录

    ie模块

    1. Zepto源码分析之ie模块(2017-11-03)

    data模块

    1. Zepto中数据缓存原理与实现(2017-10-03)

    form模块

    1. zepto源码分析之form模块(2017-10-01)

    zepto模块

    1. 这些Zepto中实用的方法集(2017-08-26)
    2. Zepto核心模块之工具方法拾遗 (2017-08-30)
    3. 看zepto如何实现增删改查DOM (2017-10-2)

    event模块

    1. mouseenter与mouseover为何这般纠缠不清?(2017-06-05)
    2. 向zepto.js学习如何手动触发DOM事件(2017-06-07)
    3. 谁说你只是"会用"jQuery?(2017-06-08)

    ajax模块

    1. 原来你是这样的jsonp(原理与具体实现细节)(2017-06-11)

    相关文章

      网友评论

        本文标题:Zepto源码分析之ie模块

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