多浏览器兼容的动态加载 JavaScript 与 CSS第1/2页
发布时间:2024-05-13 09:20:31
在介绍ensure内部的实现之前,让我们先来看看其功能:
ensure({
html: "popup.html",
javascript: "popup.js",
css: "popup.css"
}, function() {
Popup.show("hello world");
}
);
在这段代码中,ensure首先会确保popup.html、popup.js、popup.css这3个文件的加载,如果都没加载过ensure就会动态加载它们;如果已经加载过了,ensure不会再次加载。在确保这3个文件都加载后,ensure会调用后面的匿名函数,也就是执行Popup.show("hello world");。
接下来,就让我们看看ensure是如何动态加载JavaScript与CSS的。
加载JavaScript
在ensure当中,加载JavaScript分两种情况来执行,也就是Safari与非Safari这两种情况。
在IE、Firefox、Opera中加载JavaScript
在这三款浏览器中加载JavaScript,其实只需要创建一个script元素,把src指向要加载的URL,最后把script元素追加到head元素上,那就搞掂了。此项工作是在HttpLibrary.createScriptTag()中完成的。不过我们不仅仅要加载JavaScript,同时还需要知道它什么时候完成加载,这可以通过script元素的onload事件或onreadystatechange事件来实现。
在Safari中加载JavaScript
因为Safari 2不支持onload或者onreadystatechange,所以只能手动通过XHR把URL读去过来,然后再手动eval这段代码,这就带来了一个限制──只能加载本域的JavaScript文件。在ensure当中,eval的工作是通过HttpLibrary.globalEval()来完成的。为了让JavaScript代码在全局(global)上下文中eval,ensure还是使用了创建script元素的方法,并将要eval的JavaScript置于其内,最后把script元素追加到head元素内。
细心的人肯定要问,为什么HttpLibrary.globalEval()要如此设计,而非直接window.eval或者eval.call。这是因为,window.eval和eval.call都无法在IE6中实现和script标签加载JavaScript代码一模一样的效果,这两种做法的eval在IE6下仍然不是在全局上下文中执行的。搜索一下你就会发现一些相关的讨论,例如jQuery就曾经使用window.execScript()来完成此项任务。不过最终大家都发现添加script元素才是最好的跨浏览器解决方案,所以现在的jQuery和ensure都是如此实现的了。
加载CSS
相对于加载JavaScript而言,加载CSS就简单多了,而且方法也是类似的:在head元素内直接加入link元素就可以了。这也正是loadCSS()所完成的工作。
实际上,ensure没有确保CSS完成加载后再执行下去。这估计是因为浏览器都能够在CSS加载完成后自动应用到页面上,因此Omar AL Zabir就认为CSS的加载顺序是无关紧要的,不过假如CSS加载速度实在太慢,其实还是会影响显示效果的。
在IE6中加载CSS
这次需要特别照顾的是IE6,而非Safari。IE6在往head元素添加link元素时,必须在window的上下文中完成,因此添加link的函数通过call调用切换了上下文。
总结
实际上动态加载JavaScript与CSS都并不难,在大多数情况下只需要向head元素追加对应的子元素就可以了,只有Safari2和IE6这两款古老的浏览器是需要特殊照顾的。
官方地址
ensure
12下一页阅读全文
猜你喜欢
- 起因 前几天去国图拍了一本书,一本心理学方面的书,也许你问我为什么不去买一本,或者去网上找pdf。 其实吧,关于心理学方面的书可以说在市面上
- 1.cut()可以实现类似于对成绩进行优良统计的功能,来看代码示例。假如我们有一组学生成绩,我们需要将这些成绩分为不及格(0-59)、及格(
- 如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能。如下图: 第一层
- 如何使用数据绑定控件实现不换页提交数据?Chunfeng.html' 提交页面< html><
- 今日上课,有位同学问到:w和w+有何区别呢。说实话,我们经常只是用一种权限,没用在意之间的区别,实际上,w+具有可读可写权限,而w只有可写权
- 项目进行到和服务器交互,通过post访问服务器端jsp,jsp访问服务器端mysql数据库,最终返回到客户端的中文出现乱码问题。在整个流程中
- 准备工作右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库。读取图像调用imr
- 概述在PHP中有一种代码复用的技术, 因为单继承的问题, 有些公共方法无法在父类中写出, 而 Trait可以应对这种情况, 它可以定义一些复
- 相信大家都做过九宫格的游戏,规则是要求填数字1-9在九个方格内,使横竖斜相加和相等。只填九个那可能有些简单,但是填25个,填49个,81个等
- 我们在做自动化运维的时候,经常需要调用api中的接口,不过很多人不知道具体的调用方法,在学习python中的requests库后,我们就可以
- 导语:使用 python-plotly 模块来进行压测数据的绘制,并且生成静态 html 页面结果展示。不少小伙伴在开发过程中都有对模块进行
- 本文实例讲述了python实现连接mongodb的方法。分享给大家供大家参考。具体分析如下:通过pymongo可以很容易的链接到mongod
- Java开发者对于面向对象编程思维与命令行编程思维的协调程度,取决于他们如下几种能力的水平:技巧(任何人都可以编写命令行形式的代码)教条(有
- 在这个擦亮自己的眼睛去看SQL Server的系列中的第二篇中提过要写历史渊源,这里的历史主要描述的是数据库本身的历史与SQL Server
- 今天的这篇文章呢,小编来介绍一下如何通过Python来创建各种形式的文件,这里包括了文本文件CSV文件Excel文件压缩文件XML文件JSO
- 前言双端比较算法是vue2.x采用的diff算法,本篇文章只是对双端比较算法粗略的过程进行了一下分析,具体细节还是得Vue源码,Vue的源码
- vm.$delete()vm.$delete用法见官网。为什么需要Vue.delete()?在ES6之前, JS没有提供方法来侦测到一个属性
- 直接给源代码了:$current_dir = 'E:/temp/';$dir = opendir($current_dir)
- 将时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果如:{‘year':2018,‘month
- 前言参考学习书籍:《算法图解》[美]Aditya Bhargava,袁国忠(译)北京人民邮电出版社,2017二分查找 binary_sear