动态加载JavaScript的小实践

动态加载JavaScript文件和CSS资源为Web前端开发提供了巨大的灵活性,同时也实现了lazy load和按需加载,相比XMLHttpRequest而言其没有跨域的限制使其广泛应用。其基本原理是:在页面DOMReady后,利用JavaScript把指定文件路径的script和link元素插入到页面中,然后判断其加载状态再进行继续操作。

YUI的Get就专门提供了一套动态加载的机制,是YUI最基础的功能之一。在YUI中利用Get加载JavaScript和CSS资源会在HTML的head节点中插入如下代码:

<script id="..." type="text/javascript" src="some.js"></script>
<link id="..." type="text/css" rel="stylesheet" href="some.css">

当页面编码和JavaScript或CSS资源编码不一致时,常见的方法是通过charset属性声明其编码,比如页面是gb2312,而资源文件为utf-8,则设置编码后其插入的代码是

//YUI3.0.0 和 YUI 2.8.0中
<script id="..." type="text/javascript" src="some.js" charset="utf-8"></script>
<link id="..." type="text/css" rel="stylesheet" href="some.css" charset="utf-8">

然而,在IE的一些特殊情况下加载JavaScript时,当你刷新页面时会看到状态栏上有如下的错误提示
YUI3.0.0动态加载JavaScript的bug

当你通过随机参数让JavaScript文件不缓存时,或者让script元素中的charset属性位于src属性之前(比如利用YUI2.8.0之前版本加载)就不会有这个错误提示。所以,这个问题可能是IE的缓存解码机制的bug,也可以看着是YUI的bug(已经提交给YUI开发团队,将在3.1.0中解决)

因此,动态添加script或CSS资源时,把charset放在资源路径前面是最佳实践。对于YUI,暂时可以这样修改源码来修复

您或许有兴趣:

标签:, ,

作者:秦歌,时间:2009-11-05 0:56,归纳于:Javascript & DOM & AJAX,订阅:RSS 2.0,引用:Trackback

有评论 28 条,发表一条新评论 »

Hedger说:2009-11-05 5:43 #1

You can still do “通过随机参数让JavaScript文件不缓存”, but the key is that you need to append “.js” after the random key.

For example:

your-script.js?random=12345 ;// This may not work on IE.
your-script.js?random=12345.js // This works, haha.

vapour说:2009-11-05 13:01 #2

IE的缓存是一把双刃剑。方便用户,危害开发人员。

秦歌说:2009-11-05 22:06 #3

@Hedger:是的,你说的很对,虽然知道这个规则但是在写代码的时候还是漏掉了,现在加上,多谢。

@vapour说:2009-11-13 12:29 #4

危害-貌似言重了

army8735说:2009-11-13 16:34 #5

我想问个问题:
动态加载之后,加载的js或者css文件,是如何知道其加载完成从而进行相应的操作的呢?

我看每个加载的资源有个id,难道是不停侦听此id来判别吗?

动态加载css和js资源 - army8735说:2009-11-16 12:33 #6

[...] 近日,在秦歌的blog中看到动态加载的内容,主要是说YUI3.0在动态加载js的一点小bug。当时想了个问题:如何侦听动态加载的内容被成功加载了,翻阅一番后记录下来。 [...]

fer说:2009-11-19 11:27 #7

与文章无关:
秦歌你好,我一直订阅你的博客,但是文章过长我不敢点击到原文,因为你的博客字体颜色和背景色的对比太过强烈,希望能优化下字体的颜色,谢谢。

秦歌说:2009-11-19 12:05 #8

@fer:非常感谢你的支持,最近是考虑对博客改版一下,但一直拖着,对比度其实也调整了很多次,主要是不同的显示器对比度有很大不同,所以最后用了一个很不完美的方案,就是设置强烈一些,这样不至于对比度很弱的显示器看不到,而对比度强的显示器可以调节对比度。正在考虑下一步怎么做。

Supersha说:2009-12-07 16:14 #9

“在页面DOMReady后,利用JavaScript把指定文件路径的script和link元素插入到页面中,然后判断其加载状态再进行继续操作。” 思路新颖,Good!受教了~

传统的方式是在页面头部的一段js里面通过document.createElement来加载,而没有考虑DOMReady的形式,这影响了页面的加载速度。

YUI3动态加载文件缓存问题 « web前端开发工程师的随记–黑妞haha说:2010-03-09 17:13 #10

[...] 秦歌的文章里提到《用YUI3.0.0加载无缓存的JavaScript文件》,我感觉这个方案挺实用的,记下了。 原理:利用随机数避免【utf-8.js】这个文件被浏览器缓存 [...]

irideas说:2010-03-17 22:33 #11

今天发现了JQ1.4.2 和1.3.2在动态加载JS的区别
一个在HEAD头部插入 一个是尾部插入
发现头部插入时的外链JS 在指定 charset 后也会导致无法正常解析。。。。加了随机参数 算是暂且避免了
1.4.2的头部插入也是为了避免IE的某个BUG 但却引来了另一个BUG 真是就结的艰辛路。。

动态加载JavaScript的小实践 - 隐遁峰说:2010-06-04 23:38 #12

[...] source [...]

在服务端合并和压缩JavaScript和CSS文件 @ 随网之舞说:2010-06-10 19:49 #13

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

前端优化:在服务端合并和压缩 JavaScript和CSS文件 | 刘钢 - 我是UED说:2010-06-10 22:11 #14

[...] 这两种都可以使用,虽然在 早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的 样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为 P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在 修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件 « 可乐加糖说:2010-06-11 9:07 #15

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件-传播、沟通、分享-一直“有你”说:2010-06-11 22:39 #16

[...] 这两种都可以使用,虽然在 早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的 样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为 P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在 修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件说:2010-06-12 9:54 #17

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

[zt]在服务端合并和压缩 JavaScript和CSS文件 « interUI说:2010-07-03 1:20 #18

[...] 这两种都可以使用,虽然在 早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的 样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为 P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在 修改后的YUI3中使用Minify。 [...]

[zt]在服务端合并和压缩 JavaScript和CSS文件 « interUI说:2010-07-03 1:23 #19

[...] 这两种都可以使用,虽然在 早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的 样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug 设置为 P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在 修改后的YUI3中使用Minify。 [...]

小鱼儿 » Blog Archive » 在服务端合并和压缩JavaScript和CSS文件(转)说:2010-11-14 14:49 #20

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

UXRen | 用户体验那些人 | 资讯频道 » 在服务端合并和压缩JavaScript和CSS文件说:2010-11-29 18:41 #21

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件 | 纸口杯-WEB技术说:2010-12-20 21:44 #22

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件 | 来客轩说:2011-02-07 13:14 #23

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件 « 阳光小小 yhostc说:2011-04-27 16:28 #24

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

I liked this: 在服务端合并和压缩JavaScript和CSS文件 « fisherjoe说:2011-08-19 7:57 #25

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6&#65289…,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件 | 狼的blog说:2011-11-28 20:57 #26

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

在服务端合并和压缩JavaScript和CSS文件 | YAOHAIXIAO.COM说:2012-07-18 10:03 #27

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.CSS,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

HTML5SALON沙龙说:2013-02-17 23:27 #28

[...] 这两种都可以使用,虽然在早期的IE浏览器版本(如IE6)中会有无法解析的风险,且影响某些特定情况下的缓存,但当使用修改后的YUI时,合并的URL变成类似/min/b=yui&f=3.1.1/tabview/assets/skins/sam/tabview.css,的样子,就会出现bug了。对于YUI的Combo Handler来说这是一个小bug,所以YUI3把这个bug设置为P5。但当我们改造YUI3来更好的支持Minify时,还要解决这个问题,具体方案请看示例在修改后的YUI3中使用Minify。 [...]

发表一条评论

您可以在下面评论内容中使用下列XHTML标签:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

您或许有兴趣:


回到页眉