`
willko
  • 浏览: 383993 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

同步无阻塞加载js

阅读更多
一同事分析页面遇到阻塞式加载js,影响了页面的渲染速度。.

之前,实现WYSIWYG插件机制的时候为了实现lazy load,写了个同步无阻塞加载js的方法,解决方法很暴力,仅供参考,,注意,只是个demo。。。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr"> 
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
    <title>test</title> 
   <script type="text/javascript">
		var require = {};

		function importJS(file) {  
  
            if (typeof require[file] != "undefined") {  
                return;  
            }  
  
            require[file] = true;  
  
            var script = document.createElement("script");  
            script.type = "text/javascript";  
            script.src = file;  
  
            var callback = arguments.callee.caller;  
  
            script.onload = function() {  
                callback();  
                callback = function(){};  
            };  
  
            script.onreadystatechange = function() {  
                if(/loaded|complete/.test(this.readyState)) {  
                    callback();  
                    callback = function(){};  
                }  
            };  
  
            document.getElementsByTagName("head")[0].appendChild(script);  
  
            throw "";  
        }
   </script>
   <script type="text/javascript">
(function(){try {
	importJS('a.js'); //先加载a.js
	importJS('b.js'); //然后加载b.js

	alert('c'); //最后打印c
}catch (ex) {}})();
   </script>
  </head> 
  <body>

  </body>

  </html>


要使用importJS的那段js代码必须写在(function(){try { /*代码*/ }catch (ex) {}})();之间,且importJS要在头部...不然会重复执行,,,写这个demo的时候,发现ff3下嵌套加载会出现alert无法阻塞的bug

这肯定不是很好的解决方法,限制比较大,只是勉强解决同步无阻塞加载^_^,并且参考了bingo的方法

对于,同步无阻塞加载js有兴趣的朋友,可以延伸阅读:
http://bbs.51js.com/viewthread.php?tid=72939&extra=page%3D1%26amp;filter%3Ddigest
http://www.iteye.com/topic/134964
http://jindw.iteye.com/blog/66702
http://jsvm.org/forums/2424/ShowPost.aspx#2424

希望,有朋友可以提供一个比较好的解决方法。
分享到:
评论

相关推荐

    JS同步、异步、延迟加载的方法

    本文讲述了JS同步、异步、延迟加载的方法。分享给大家供大家参考,具体如下: 一:同步加载 我们平时使用的最多的一种方式。 [removed][removed] 同步模式,又称阻塞...异步加载又叫非阻塞加载,浏览器在下载执行j

    JavaScript无阻塞加载和defer、async详解

    无阻塞加载 把js放在head里,浏览器是怎么去执行它的呢,是按顺序加载还是并行加载呢?在旧的浏览器下,都是按照先后顺序来加载的,这就保证了加载的js依赖不会发生问题。但是少部分新的浏览器已经开始允许并行加载...

    javascript异步加载

    默认情况javascript是同步加载的,javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,接下来将为你详细介绍下异步加载js三种实现方案,

    js异步加载的三种解决方案

    默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页头会导致加载很慢的话,是会严重影响用户...

    JavaScript异步加载问题总结

    默认的js是同步加载的,这里的“加载”可以理解成是解析、执行,而不是“下载”,在最新版本的浏览器中,浏览器对于代码请求的资源都是瀑布式的加载,而不是阻塞式的,但是js的执行总是阻塞的。这会引起什么问题呢?...

    Javascript 异步加载详解(浏览器在javascript的加载方式)

    同步加载 我们平时最常使用的就是这种同步加载形式: [removed][removed] 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像)、渲染、代码执行。 js 之所以要...

    JS异步加载的三种实现方式

    默认正常模式下下,JS是同步加载的,即优先加载JS,只有当JS文件下载完,dom和css才开始加载,当某些时候我们需要JS异步加载,我们可以通过以下方式来设置异步加载,不同情况下选取不同方式即可 1.defer:defer JS...

    vue异步加载高德地图的实现

    几种加载js的方式 同步加载 异步加载 延迟加载 同步加载 用的最多的一种方式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作。所以默认同步执行才是安全的。...

    详解JS异步加载的三种方式

    同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作。所以默认同步执行才是安全的。但这样如果js中有输出document内容、修改dom、重定向等行为,就会造成...

    JavaScript异步加载浅析

    关于JavaScript脚本加载的问题,相信大家碰到很多。主要在几个点—— 1&gt; 同步脚本和异步脚本带来的文件加载、文件依赖及执行顺序问题 2&gt; 同步脚本和异步脚本带来的性能优化问题 深入理解脚本加载相关的方方面面问题...

    vue-loading:用于在客户端请求时阻塞

    Vuejs 加载屏幕 用于阻止客户端处理的工作。 请查看以查看它的外观。 安装 npm i --save vuejs-loading-screen 用法 import Vue from 'vue' import loading from 'vuejs-loading-screen' Vue . use ( loading ) ...

    浅析浏览器解析和渲染.pptx

    各浏览器加载策略,ie6/7/8/9,firefox,chrom.同步模型,JS阻塞,JS执行策略 ,Inline Script,阻塞渲染,浏览器的优化

    程序员为什么还要刷题-js-ajax:[js,ajax]

    程序员常刷题AJAX 和 API 学习目标 解释同步和异步程序执行的区别 ...要是我们有一种非阻塞和异步的客户端语言就好了…… 转身谈话(10 分钟) 5 分钟 T&T。 5分钟复习。 . 当您与 Web 应用程序交互时,请考虑以下问题

    node-stream-zip:node.js库,用于快速读取大型ZIP

    特征: 它永远不会将整个存档加载到内存中,所有内容都按块读取大型档案支持所有操作都是非阻塞的,没有同步输入/输出快速初始化没有依赖关系,没有二进制插件内置zlib模块进行解压缩deflate,sfx,macosx / ...

    大型ZIPs文件查看node-stream-zip.zip

    特性:从不加载完整的归档到内存,一切都是通过块读取大型归档支持所有操作都是非阻塞,非同步 i/o快速初始化无依赖,无二进制组件内置 zlib 模块解压deflate, deflate64, sfx, macosx/windows 内置归档ZIP64 支持...

    java开源包1

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包11

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包2

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包3

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

Global site tag (gtag.js) - Google Analytics