美文网首页
JS: 非阻塞脚本

JS: 非阻塞脚本

作者: amnsss | 来源:发表于2015-11-04 18:14 被阅读214次

defer属性

HTLM4为<script>标签扩张了一个属性: defer.这个属性指明元素中所包含的脚本不打算修改DOM, 因此代码可以稍后执行. 对于外部引用脚本也一样, 会下载但是不会立即执行.执行的时间点会在onload事件之前. 但是defer的浏览器支持有限.

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>defer test</title>
</head>
<body>
<script defer>
  alert('defer');
</script>
<script>
  alert('script');
</script>
<script>
  window.onload=function(){
    alert('onload');
  }
</script>
</body>
</html>

对于上面代码, 支持defer的浏览器的输出顺序是script-->defer-->onload. 不支持defer的浏览器输出顺序是defer-->script-->onload.
对于chrome虽然支持defer, 但输出顺序却不一致.
浏览器的测试结果:
opera 11 “defer –> script –> onload”(支持,但顺序不一致)
safari 5.0 “defer –> script –> onload” (支持,但顺序不一致)
ie8 “script –> defer –> onload” (顺序一致)
ie6 “defer –> script –> onload” (支持,但顺序不一致)
chrome 17.0.963.26 “defer –> script –> onload” (支持,但顺序不一致)

动态脚本元素

文档对象模型(DOM)允许你使用JavaScript动态创建HTML的几乎全部文档内容, 包括<script>.

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'file1.js';
document.getElementsByTagName('head')[0].appendChild(script);

新的<script>元素加载file1.js源文件.此文件当元素添加到页面之后立刻开始下载.
此技术的重点在于: 无论在何处启动下载, 文件的下载和运行都不会阻塞其他页面处理过程.你甚至可以将这些代码放在<head>部分而不会对其余部分的页面代码造成影响(除了用于下载文件的HTTP链接).

XHR脚本注入

另一个以非阻塞方式获得脚本的方法是使用XMLHttpRequest(XHR)对象将脚本注入到页面中.此技术首先创建一个XHR对象, 然后下载JavaScript文件, 接着用一个动态<script>元素将JavaScript代码注入页面.

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

相关文章

  • JS: 非阻塞脚本

    defer属性 HTLM4为 标签扩张了一个属性: defer.这个属性指明元素中所包含的脚本不打算修改DOM, ...

  • 浏览器的事件循环机制(Event Loop)

    js是一门单线程的非阻塞的脚本语言单线程意味着,js在执行的时候,只有一个主线程来处理所有的任务。非阻塞则是当代码...

  • nodejs是什么

    nodejs是什么 nodejs是js runtime使用事件驱动 和 非阻塞I/O 模型 非阻塞I/O 阻塞:...

  • AJAX请求(原生js,jQuery)

    概念 ajax (Asynchronous JavaScript and XML) 异步:(不会阻塞js脚本的运行...

  • Event Loop

    JS单线程 JS是一门单线程的非阻塞的脚本语言,只有一个主线程来处理所有任务。当JS执行一系列任务时,由于JS是单...

  • 浏览器性能提升--js加载优化

    动态加载js脚本函数封装优点:js代码加载不阻塞浏览器其他的执行

  • js页面渲染

    CSS和JS在网页中的放置顺序是怎样的? 脚本会阻塞后面内容的呈现 脚本会阻塞其后组件的下载 对于图片和CSS, ...

  • JS中的Event Loop和异步执行

    Event Loop JS是一门单线程的非阻塞的脚本语言,只有一个主线程来处理所有任务。当JS执行一系列任务时,由...

  • Node.js 调用栈

    Node.js 是异步非阻塞I/O的。如何解释 Node.js 即是单线程又是异步且非阻塞I/O的,需要理解 No...

  • javascript异步详解1:事件循环机制EventLoop

    一. js运行机制 js是单线程,但是存在同步【阻塞】和异步【非阻塞】执行模式 同步:从上到下、从左到右的⽅式执⾏...

网友评论

      本文标题:JS: 非阻塞脚本

      本文链接:https://www.haomeiwen.com/subject/ekaqhttx.html