非堵塞 延迟脚本 高性能

1、延迟解析

<script type="text/javascript" src="file1.js" defer></script>     defer告诉解析器该脚本不会修改Dom,可以迟点再解析执行

也可以写在网页内脚本

<script defer>

alert("defer");

</script>

2、动态生成脚本连接

function loadScript(url, callback){

var script = document.createElement("script"),

script.type = "text/javascript";

if (script.readyState) {                                                                  //IE

script.onreadystatechange = function()  {

if (script.readyState == "loaded" || script.readyState == "complete")  {

script.onreadystatechange = null;

callback();

}

};

} else {                                                                        //Others
        script.onload = function(){
            callback();
         };
    }
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

使用方式:

loadScript("file1.js", function(){

loadScript("file2.js", function(){                  //这里动态加载了三个脚本,注意加载的顺序,Firefox和opera会按你写的顺序执行,而有些浏览器则是按照它们从服务器返回的顺序执行

loadScript("file3.js", function(){

alert("All files are loaded!");

});

});

});

3、ajax 脚本注入

var xhr = new XMLHttpRequest();

xhr.open("get", "file1.js", true);

xhr.onreadystatechange = function()  {

if (xhr.readyState == 4)  {

if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)  {

var script = document.createElement("script");

script.type = "text/javascript";

script.text = xhr.responseText;

document.body.appendChild(script);

}

}

};

xhr.send(null);

推荐的模式(第二种),在页面里写动态生成脚本的函数,再动态加载可以延迟执行的脚本

<script type="text/javascript">

function loadScript(url, callback)  {

var script = document.createElement("script"),

script.type = "text/javascript";

if (script.readyState)  {                                                   //IE

script.onreadystatechange = function()  {

if (script.readyState == "loaded" || script.readyState == "complete")  {

script.onreadystatechange = null;

callback();

}

};

} else {                                                                       //Others

script.onload = function(){

callback();

};

}

script.src = url;

document.getElementsByTagName("head")[0].appendChild(script);

}

loadScript("the-rest.js", function(){

Application.init();

});

</script>

时间: 2024-11-20 13:33:26

非堵塞 延迟脚本 高性能的相关文章

延迟脚本的那些事

最近看了javascript 高级程序设计第三版 和 高性能javascript  对于 延迟脚本好像有点出入(可能是我理解的出入,所以打算自己亲自测试一下 来证明  到底怎么回事)高级程序设计中对于defer的解释:这个属性的用途表明脚本在执行时不影响页面的构造 (脚本会被延迟到整个页面都解析完毕在运行)所以加上这个属性就是告诉浏览器在遇到这个属性的时候立即下载但是延迟去执行   html5规范如果有多个defer的外部脚本  那么按照出现的先后顺序来执行  所有支持html5 的浏览器都应该

01_Tornado入门(异步和非堵塞)

Asynchronous and non-Blocking I/O Real-time web features require a long-lived mostly-idle connection per user. In a traditional synchronous web server, this implies devoting one thread to each user, which can be very expensive. 原文翻译: 实时WEB应用(Real-tim

原生 JS 中 延迟脚本和异步脚本

一.延迟脚本 defer HTML4.0中为<script> 标签添加了个defer属性.属性的用途是表民脚本在执行时不会影响页面的构造. 脚本会被延迟到页面加载完毕的时候,执行.也就是当浏览器解析到</html> 标签后才会执行代码.在HTML5规范中,defer属性中适用于外部脚本. 而家了defer  的脚本文件会比DOMContentLoaded事件触发前执行. 二.异步脚本 async HTML5为<script>添加了个async属性.这个属性与defer属

javascript中的延迟脚本技术

<html> <head> <title>javascript中的延迟脚本技术<title> <script type="text/javascript" defer="defer" src="some.js"></script> <head> <body> <!-- 内容--> </body> <html> def

php使用flock堵塞写入文件和非堵塞写入文件

堵塞写入代码:(全部程序会等待上次程序运行结束才会运行,30秒会超时) <?php $file = fopen("test.txt","w+"); $t1 = microtime(TRUE); if (flock($file,LOCK_EX)) { sleep(10); fwrite($file,"Write something"); flock($file,LOCK_UN); echo "Ok locking file!&quo

Java多线程之~~~线程安全容器的非堵塞容器

在并发编程中,会常常遇到使用容器.可是假设一个容器不是线程安全的.那么他在多线程的插入或者删除的过程 中就会出现各种问题.就是不同步的问题.所以JDK提供了线程安全的容器,他能保证容器在多线程的情况下安全的插 入和删除.当然,线程安全的容器分为两种,第一种为非堵塞似的,非堵塞的意思是当请求一个容器为空或者这个请求 不能运行的时候.就会报出异常,另外一种堵塞的意思是,不能运行的命令不会报出异常.他会等待直到他能运行.以下 我们实现一个样例,这个样例就是多个线程去大量的插入容器数据.而还有一个线程去

Java Nio 十一、Java NIO:非堵塞服务器

最后更新时间:2015-10-23 甚至如果你理解JAVA NIO的非堵塞特点的工作方式(Selector,Channel,Buffer等等),而设计一个非堵塞服务器也是难得.相对堵塞IO来说,非堵塞IO包含几个挑战.这个非堵塞服务器教程将会讨论非堵塞服务器的主要挑战,并且对于他们描述一些潜在的解决方案. 关于设计一个非堵塞服务器发现一些好的信息是难得.因此在这个教程中提供的解决方案是基于我自己的工作经验和想法.如果你有一些另类的或者更好的想法,我将会很高兴的听到关于这些想法.你可以写一个评论在

《网络编程》非堵塞 I/O

概述 在前面文章中,我们介绍了 I/O 的五种模型<I/O 模型>.从那里能够知道,非堵塞式的 I/O 是进程调用 I/O 操作时.若数据未准备就绪.则马上返回一个 EWOULDBLOCK 错误.在数据准备就绪之前,应用进程採用轮询的方式检查数据是否准备就绪.直到数据准备就绪,则内核把该数据拷贝到应用进程的缓冲区,完毕数据复制之前进程处于堵塞状态,直到数据复制完毕后才返回.即 I/O 操作第一阶段处于轮询检查状态,第二阶段处于堵塞状态. 套接字的 I/O 操作默认状态是採用堵塞式.即当不能马上

IO模式——同步(堵塞、非堵塞)、异步

为什么IO模式非常重要?由于现代的计算机和操作系统的架构决定了CPU是稀缺资源,大家都要来一起竞争.而IO(特别是网络相关的IO)的速度往往较慢.所以怎样进行IO就有了多种模式,包含同步.异步.堵塞.非堵塞等等. 不少人把这几个概念放到一起讨论,非常多时候也难以区分. 这里从根上剖析下该怎么看待这几个概念. 首先.异步和同步是相对的,而同步情况下又有堵塞和非堵塞之分. 异步非常easy理解.当用户程序须要进行IO的时候,发出IO请求,然后就立马返回.能够继续做其他事情. 比如.从网络收包,当包抵