Web Workers

为什么用web workers?

浏览器的原理中决定了页面打开只有一个主线程——UI渲染线程,如果线程中有耗时的程序(js)会阻塞线程,使得页面中其他的UI无法渲染,我们一般把js文件放在body结束之前,或者优化算法复杂度。但是根本上解决还是线程的问题。在HTML5中新增了web Workers的方法,用来解决JavaScript多线程的问题。把一些耗时的程序放在单独的js中,和浏览器的UI渲染线程同步执行。

如何用:

1.首先把需要单独执行的js代码单独放在一个js文件(such as fanfan.js);

    onmessage方法接收主线程发送过来的数据

    postMessage(data)向主线程发送数据

  /**

  * Created by fanfan on 2016/11/17.

  */

 onmessage=function(e){//onmessage方法接收主线程发送过来的数据

 var n= e.data;

     n=parseInt(n);

 var result =isPrime(n);

 postMessage(result);//postMessage(data)向主线程发送数据

 }

 function isPrime(num){//判断质数的算法

 var result = false;

 for(vari=2; i<num; i++){

 if(num%i===0){

 break;

         }

     }

 if(i===num){

         result = true;  //是质数

     }

 return result;

 }

fanfan.js

2.在使用js文件的HTML页面中调用js文件

①创建一个web worker线程

var w=new Worker(url);

②传递数据给worker

w.postMessage(data);

③接受worker返回的数据

w.onmessage=function(e){

console.log(e.data);

}

④释放web worker占用的资源

w.terminate();

    完整代码: 

 <!DOCTYPE html>

 <html>

 <head lang="en">

 <meta charset="UTF-8">

 <title></title>

 <style>

 div{

 border:1px solid #ccc;

 width: 100px;

 height: 100px;

         }

 </style>

 </head>

 <body>

 <h3>判断质数</h3>

 <input type="text" id="num"/><button id="btn">开始判断</button>

 <div id="r"></div>

 <script>

 btn.onclick=function() {//btn监听事件

 var n=num.value;

 var w = new Worker('worker.js');//实例化一个worker对象

 w.postMessage(n);//向worker发送数据

 w.onmessage=function(e){//获取worker返回的数据

 r.innerHTML= e.data;

             }

         }

 </script>

 </body>

 </html>

index.html

以上事例结果为在html页面输入一个值,然后再worker中判断是否为质数,然后把结果打印在页面上的过程

注意事项:

本地运行index.html文件,在chrome中出现错误(chrome不支持),但是在firefox运行正确。

在web服务器环境下chrome就可以正常运行了。

web worker的跨域访问限制

在index.html中new worker(url)来创建work对象,加载的js文件不能跨域!

局限性:在web worker的js中无法访问index.html中的DOM等,很大局限。所以看情况使用。

最新文章

  1. windows和linux执行class
  2. *HDU 1115 计算几何
  3. C# 利用ICSharpCode.SharpZipLib实现在线加密压缩和解密解压缩
  4. 20145301&amp;20145321&amp;20145335实验四
  5. 设置SecureCRT配色和解决乱码问题
  6. AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5
  7. cocopods的使用方法
  8. Executing a script from Nagios event handler fails to run
  9. List 三种遍历的方法
  10. Hadoop 2.6.0编译on mac
  11. 一种实现C++反射功能的想法(二)
  12. 非常全面的Linux知识点总结
  13. 享受release版本发布的好处的同时也应该警惕release可能给你引入一些莫名其妙的大bug
  14. 学习TensorFlow,线性回归模型
  15. 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
  16. 用CSS解决一个让人头疼的问题
  17. 如何用Baas快速在腾讯云上开发小程序-系列4:实现客户侧商品列表、商品详情页程序
  18. &lt;Hadoop重装&gt;&lt;centos&gt;&lt;NameNode失效&gt;
  19. SPSS-生存分析
  20. 【ElasticSearch】:elasticsearch.yml配置

热门文章

  1. 用SHELL与列表处理了件尴尬事
  2. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器
  3. verilog流水线加法器
  4. iOS避免键盘遮挡输入方案
  5. SqlServer2000下实现行列转换
  6. hdu 2033
  7. 配置 VS 2015 开发跨平台手机应用
  8. IPointCollection,ISegmentCollection和IGeometryCollection
  9. oracle数据库exp/imp命令详解
  10. uva 10212 - The Last Non-zero Digit.