无阻赛的脚本

js脚本的加载与执行



1、延迟脚本(defer属性) 
带有defer属性的script标签,可以放置在文档的任何位置,在页面解析到该标签时,会开始下载该脚本,但是不会立即执行,直到dom加载完成(onload事件触发前执行)。并且defer属性的script叫脚本的下载,不会阻塞其他进程,这类文件可以和页面中的其他资源并行下载。 
注:defer属性只有IE和FF3.5+支持

2、 动态添加脚本 
通过动态创建script标签引入外部脚本,加载完后立即执行。 
这种技术的特点:无论何时启动下载,文件的下载和执行不会阻塞页面其他进程。(把新建的脚本放在head里面比body要好,以防body还未加载完成) 
但是当有其他脚本依赖于该动态引进的脚本时,必须保证该脚本下载完毕并且准备就绪。FF、chrome等通过script的onload事件监听,而IE通过触发readystatechange事件来监听。 
FF、Chrome

```javascript

  1. script.onload=function (){
  2. //脚本加载完毕,可以执行依赖该脚本的操作
  3. };

```

IE浏览器中:

  1. script.onreadystatechange=function (){
  2. if(script.readyState==‘loaded‘ || script.readyState==‘complete‘){
  3. //脚本加载完毕
  4. }
  5. };

综上,一个通用的方法:

  1. function loadscript(url,callback){
  2. var script=document.createElement(‘script‘);
  3. script.src=url;
  4. if(script.onload){
  5. script.onload=function (){
  6. //脚本加载完毕,可以执行依赖该脚本的操作
  7. callback();
  8. };
  9. }else{ //IE
  10. script.onreadystatechange=function (){
  11. if(script.readyState==‘loaded‘ || script.readyState==‘complete‘){
  12. callback(); //脚本加载完毕
  13. }
  14. };
  15. }
  16. document.getElementsByTagName(‘head‘)[0].appendChild(script);
  17. }

多个脚本有依赖关系时,可以 
loadscript(‘f1.js‘,function (){ 
loadscript(‘f2.js‘,function(){ }); 
}); 
3、XMLHttpRequest脚本注入

  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){
  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);

优点:所有主流浏览器都支持 
缺点:请求的js脚本必须和页面处于相同的域(文件无法从CDN下载)。大型的web应用一般不会采用该方法。

4、document.write Script Tag 
使用document.write把HTML标签script写入页面。 
缺点是只有在IE中是并行加载脚本的。 
代码如下:

    1. document.write("<script type=‘text/javascript‘ src=‘test.js‘><\/script>");
时间: 2024-10-10 09:25:10

无阻赛的脚本的相关文章

wap图片滚动特效_无css3 元素js脚本编写

手机图片滑动切换,网上有很多这样的例子,但都借助于其他组件,让代码混乱的不行:还有就是用到css3里的 transform:translate(x,y);移动元素,不过发现在不支持css3的设备上马上完蛋了,所 有下定决心自己做一个,谁知出现了很多的问题,其中最重要的是给图片加链接,网页中的上下滚动条不能在拖动图片的时候滚动,并且不能兼容pc机器上的拖动:在这里就简单介绍一下遇到的问题和解决的方法: 问题一:给图片加上链接后,在拖动的时候总是跳到其他页面: 问题根源主要是不能判断是点击还是拖动,

无阻塞加载脚本

一个页面,从被请求访问,到用户可以看到页面.操作页面,到最后页面完全加载完毕,中间需要经历一个相当奇幻的过程,这个过程的速度被"web性能师"孜孜不倦.前赴后继的优化.本文讨论的是其中一个优化. 浏览器线程和阻塞 虽然大家耳熟能详的一句话是: JavaScript是单线程的. 但是: 浏览器当然不是单线程的. 浏览器的多线程中,有的线程负责加载资源,有的线程负责执行脚本,有的线程负责渲染界面,有的线程负责轮询.监听用户事件. 这些线程,根据浏览器自身特点以及web标准等等,有的会被浏览

Linux 批量建立信任关系,实现ssh无password登陆的脚本

作用: 把当前机器的ssh公钥拷贝到其它机器.以实现从当前机器能够ssh无password登陆到其它机器 用法: 1)把要加入的ip地址写入到一个文件里.比方host 2)把脚本保存为sh文件,如 install_ssh.sh 设置可运行权限 3)改写脚本中的password设置.眼下仅仅支持固定几个password. 4)  运行命令 sh install_ssh.sh <host 代码: #!/bin/sh auto_ssh_copy_id() { local HOST=$1 local P

无阻塞加载脚本,按序执行

通常加载页面的时候,对于组件是并行下载的,现代大部分浏览器对于Js同样也是支持并行下载,但是在脚本下载.解析并执行完毕之前,不会开始下载任何其他内容. 正常引入: 可以看出,在脚本下载完毕后的一段时间内(该时间在解析执行脚本),不会对其他组件进行下载,以下几种方案解决该问题. 1. XHR Eval加载脚本: 即使用ajax引入脚本,并通过eval对其执行. 代码: var xhrObj = getXHRObject(); xhrObj.onreadystatechange = function

无阻塞加载脚本的方案

1.动态加载脚本 <script type="text/javascript"> function loadScript(url){ var script=document.createElement("script"); script.type="text/javascript"; script.src=url; document.body.appendChild(script); } loadScript("js/sid

框架无滚动条的javascript脚本

主要是通过修改scrolling来去除iframe的滚动条 代码比较简单 <!DOCTYPE html> <html> <head> <script> function removeScroll() { document.getElementById("myframe").scrolling="no"; } </script> </head> <body> <iframe id

JavaScript阻塞剖析与改善

一.阻塞特性 <高性能JavaScript>一书中,关于第一章“Loading and Execution”,提到了无阻塞加载JavaScript技术,目的是为了提高页面呈现速度. 说到无阻塞加载JavaScript要点,我们就有必要知道,为什么在html中不管是内联JavaScript还是外联,会影响到页面的性能? 原因是:JavaScript是单线程,在JavaScript运行时其他的事情不能被浏览器处理.事实上,大多数浏览器使用单线程处理UI更新和JavaScript运行等多个任务,而同

项目中的Libevent(多线程)

多线程版Libevent //保存线程的结构体 struct LibeventThread { LibEvtServer* that; //用作传参 std::shared_ptr<std::thread> spThread; // 线程 struct event_base * thread_base; // 事件根基 struct event notify_event; evutil_socket_t notfiy_recv_fd; // socketpair 接收端fd(工作线程接收通知)

underscore.js

underscore是一个非常实用的javascript库,提供许多编程时需要的功能的支持,在不扩展任何javascript原生对象的情况下提供很多实用的功能.主要涉及对Collection.Object.Array.Function的操作.一共60多个函数. 函数介绍: 一.Collection Functions (Arrays or Objects) [集合函数]: 1.#each# _.each(list, iterator, [context]) 迭代list中的所有元素,按顺序用迭代