javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题。
在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 。原因是,事实上,大多数浏览器使用单进程处理UI和更新Javascript运行等多个任务,而同一时间只能有一个任务被执行。Javascript运行了多长时间,那么在浏览器空闲下来响应用户交互之前的等待时间就有多长。

从基本层面说,这意味着
1 2 3Script Example 4 5 6 78 11
12 13
当浏览器遇到一个
立即学习“Java免费学习笔记(深入)”;
因为脚本阻塞其他页面资源的下载过程,所以推荐的办法是:将所有
1 2 3Script Example 4 5 6 7 8Hello world!
9 <-- Example of recommended script positioning --> 10 11 12 13 14
此代码展示了所推荐的
另外,Yahoo! 为他的“Yahoo! 用户接口(Yahoo! User Interface,YUI)”库创建一个“联合句柄”,这是通过他 们的“内容投递网络(Content Delivery Network,CDN)”实现的。任何一个网站可以使用一个“联合句柄”URL 指出包含 YUI 文件包中的哪些文件。例如,下面的 URL 包含两个文件:
这个defer属性指明元素中所包含的脚本不打算修改DOM,因此代码可以稍后执行。defer属性只被Internet Explorer 4+和Firefox 3.5+支持,它不是一个理想的跨浏览器解决方案。在其他浏览器上,defer属性将被忽略。所以,
一个带有defer属性的
可以使用下述代码测试浏览器是否支持defer属性:
1 2 3Script Defer Example 4 5 6 7 8 9 10 11如果浏览器不支持defer,那么弹出的对话框的顺序是“defer”,“script”,“load”。
wordpress图片展示类主题下载这是易秀购主题网分享的一款展示为图片类的类的wordpress主题,WP主题熟悉的朋友应该一眼能看出这是瀑布流修改优化而来。主题并且采用了Ajax加载技术,主题代码非常精简,加载速度非常快。这款图片类主题格式化了几个自定义栏目,分别是price(价格)、from(购买自…)、ob-url(单品url)、shop-url(店铺url)和banner(文章详细页面上部的图片,如果
如果浏览器支持defer,那么弹出的对话框的顺序是“script”,“load”,“defer”。
Dynamic Script Elements 动态脚本元素
DOM允许我们JS0动态创建HTML的几乎所有文档内容,一个新的
1 var script = document.createElement ("script"); 2 script.type = "text/javascript"; 3 script.src = "file1.js"; 4 document.body.appendChild(script);新的
当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了Firefox和Opera,它们将等待此前的所有动态脚本节点执行完毕)。
大多数情况下,我们希望调用一个函数就可以实现Javascript文件的动态下载。下面的函数封装实现了标准实现和IE实现:
1 function loadScript(url, callback){ 2 var script = document.createElement ("script") ; 3 script.type = "text/javascript"; 4 5 if (script.readyState){ //IE 6 script.onreadystatechange = function(){ 7 if (script.readyState == "loaded" || script.readyState == "complete"){ 8 script.onreadystatechange = null; 9 callback(); 10 } 11 }; 12 } 13 else { //Others 14 script.onload = function(){ callback(); 15 }; 16 } 17 script.src = url; 18 document.getElementsByTagName("head")[0].appendChild(script); 19 } 20 21 loadScript("file1.js", function(){ //调用 22 alert("File is loaded!"); 23 });此函数接受两个参数:Javascript文件的Url和一个当Javascript接收完成时触发的JS1。属性检查用于决定监视哪种事件。最后一步src属性,并将javascript文件添加到head。
动态脚本加载是非阻塞Javascript下载中最常用的模式,因为它可以跨浏览器,而且简单易用。
JS2HttpRequest Script Injection XHR脚本注入
另一个以非阻塞方式获得脚本的方法是使用XMLHttpRequest(XHR)JS3将脚本注入到页面中。此技术首先创建一个XHR对象,然后下载Javascript文件,接着用一个动态
1 var xhr = new XMLHttpRequest(); 2 xhr.open("get", "file1.js", true); 3 xhr.onreadystatechange = function(){ 4 if (xhr.readyState == 4){ 5 if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){ // 检查http状态码 6 var script = document.createElement("script"); 7 script.type = "text/javascript"; 8 script.text = xhr.responseText; 9 document.body.appendChild(script); 10 } 11 } 12 }; 13 xhr.send(null);此代码向服务器发送一个获取file1.js的文件get请求。onreadystatechangeJS4函数检查readyState是不是4,然后检查HTTP状态码是不是有效(200表示确定客户端请求已成功,2xx表示有效回应,304表示一个JS5响应)。如果收到一个有效响应,那么就创建一个新的
此方法的优点是兼容性佳,且你可以下载不立即执行的Javascript代码。由于代码返回在
此方法的确定是受到浏览器同源限制,Javascript文件必须与页面放置在同一个域内,不能从CDN(内容分发网络Content Delivery Network)下载。正因为这个原因,大型网页通常不采用XHR脚本注入技术。
Recommended Noblocking Pattern 推荐的非阻塞模式
推荐的向页面加载大量Javascript的方法分为两个步骤:
第一步,包含动态加载Javascript所需的代码,然后加载页面初始化所需的除了Javascript之外的部分。这部分代码尽量小,可能只包含loadScript()函数,它的下载和运行非常迅速,不会对页面造成很大干扰。
第二步,当初始代码准备好之后,用它来加载其余的Javascript。
例如:
1
将此代码放置在body的关闭标签











