h5shiv.js实现原理及代码学习

h5shiv.js实现原理及代码学习

html方面主要是学习了H5的一些标签和属性的运用,因为要兼容IE8,所以采用的比较少,然后兼容是使用h5shiv.js这个库来实现的。稍微了解了一下h5shiv的工作机制####

参考连接 https://www.xxling.com/blog/article/41.aspx
源码链接 https://github.com/aFarkas/html5shiv/blob/master/src/html5shiv.js

源码注释非常的多(和代码量差不多,源码总共才300行,空行和注释大概有一大半),写的逻辑也很清晰,这种代码风格可以学习一下。

1.首先是如何检测浏览器是否支持HTML5标签的样式,通过创建一个标签,然后检测标签中是否有html5的新属性(源码用的是a标签的hidden属性)("hidden" in a)若为true则说明支持,否则不支持。
2.然后是如何检测浏览器是否支持Html5标签,通过向刚才创建的a标签里添加一个自定义子标签,通过a.childNodes.length来判断 IE8及以下返回为0,其余为1
3.最后通过对document.creatDocumentFragement方法中的三个属性cloneNode createDocumentFragment createElement 来判断是否支持html5标签。

  • 检测完毕后 如果不支持html5标签样式则向<head>标签里添加H5的css样式。如下图所示,可以看到IE8里head里被插入了一个样式表。这个样式表是为了初始化h5的样式,因为h5标签默认为内联标签
这里写图片描述
h5shiv添加的样式
  • 如果不支持html5标签则通过document.creatElement来一一创建一次h5的标签。只要在document里创建过一次对象后,后续的样式就能正常的应用在h5标签上了。为了验证这一过程,做个简单的实验
    代码:
    <body>
    <xyz>aabbcc</xyz>
    </body>
    样式:
    <style type="text/css">
    xyz{
    display:block;
    height:100px;
    width: 100px;
    background-color: red;
    color:#fff;
    }
    </style>
    IE8下显示效果:
    这里写图片描述

添加script :
document.creatElement("<xyz></xyz>");
IE8下显示效果:

这里写图片描述
  • 知识点1 documentFragment,在平时经常会遇到循环里往某个节点一直添加新的节点的情况 e.g:
    for(var i = 0;i < 10;i++){
    var node = document.creatElement("<a></a>");
    document.body.append(node);
    }
    这样的情况下每次append都会引起整个页面的回流,消耗性能巨大。改写成如下情况。
    var d = document.createDocumentFragment();
    for(var i = 0;i < 10;i++){
    var node = document.creatElement("<a></a>");
    d.append(node);
    }
    document.body.append(d);
    这样写则只会引起一次回流,就是append(d)的时候。可以把documentFragement理解成在document里的缓存碎片节点。
  • 知识点2 Function()与eval()
    Function是类实例的封装对象,类似于String之于string。
    Function()可以通过 Function(arg1,arg2,...,argn,执行体);的结构构造一个函数,其中执行体为字符串,执行方式同eval,但是性能会比eval高很多,所以推荐使用Function()替代,而且Function中新var出来的变量在局部作用域中,不会造成全局污染。当然两者的可读性都不是很好,能不用最好不用。

  • 知识点3 h5shiv.js的写法 代码风格
    通过闭包(function(window,document){
    })(window,document); 的方式将内容全部封装到一个立即执行函数里,然后通过window.html5 = html5 的方式将内部接口暴露出来。能避免全局污染,同jquery暴露出来的只有$和jQuery两个对象。
    整个函数的结构为
    (function(window,document){
    part 1 : 变量声明;
    part 2 : 检查H5支持情况 , 立即执行函数
    part 3 : 功能函数
    part 4 : 暴露接口
    part 5 : 函数入口
    })(window,document);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,702评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,143评论 3 415
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,553评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,620评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,416评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,940评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,024评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,170评论 0 287
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,709评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,597评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,784评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,291评论 5 357
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,029评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,407评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,663评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,403评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,746评论 2 370

推荐阅读更多精彩内容