专栏首页IMWeb前端团队Zepto源码分析之ie模块

Zepto源码分析之ie模块

本文作者:IMWeb 谦龙 原文出处:IMWeb社区 未经同意,禁止转载

前言

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

<!-- more -->

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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mvvm学习&vue实践小结

    1 mvvm 学习 1.1 实现原理 mvvm类框架的实现原理不复杂,大致如下: 模板分析得到依赖的属性 通过某种变动监测手段监测这些依赖的属性 当属性变动的时...

    IMWeb前端团队
  • Ques核心思想——CSSNamespace

    本文作者:IMWeb 杨文坚 原文出处:IMWeb社区 未经同意,禁止转载 Facebook's challenges are applicable...

    IMWeb前端团队
  • Ques核心思想——CSSNamespace

    Shadow DOM的样式是完全隔离的,这就意味着即使你在主文档中有一个针对全部 <h3> 标签的样式选择器,这个样式也不会不经你的允许便影响到 shadow ...

    IMWeb前端团队
  • encodeURI、encodeURIComponent区别--非常好的图

    这个图真的太好了,所以copy一下分享给各位宝宝。原文地址:https://juejin.im/post/5835836361ff4b0061f38a5d

    用户3258338
  • Petuum完成9300万美元B轮融资,软银领投,让机器学习落地各行各业

    机器之心
  • mySAP 供应链管理-成功故事2

    嘉士伯公司四个月内完成mySAP SCM供应链管理中需求计划的实施,库存量降低35%,供货准确率提高20% 嘉士伯丹麦公司必须考虑季节、气候、活动和促销等因素,...

    SAP最佳业务实践
  • Arch Linux安装MariaDB

    用户1456517
  • Ruby安装演示

    如果勾选了安装MSYS2,Ruby安装完后会有MSYS2的安装,点击enter就可以了。

    小蓝枣
  • Hibernate HQL 语句

    import java.util.Iterator; import java.util.List; import java.util.Map;

    Hongten
  • linux安装软件时提示软件包不存在的解决方法

    软件包不存在时可能是被安装软件的软件源没有安装,我的是cent os,安装w3m时,出现这个问题,解决办法:先安装软件源(epel-release),然后更新系...

    砸漏

扫码关注云+社区

领取腾讯云代金券