【面向HTML5--WebWorker】
2017-10-08 17:45
295 查看
web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。你可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。
若Web页面中执行了很耗时的JS任务(如加解密、复杂路径计算、多参数计算等),由于所有的HTML/CSS/JS代码都在同一个UI主线程中执行,会导致页面“卡死”。
根本解决办法:创建一个新的并发线程,在新的线程中执行耗时JS任务,让UI主线程继续渲染页面/监听事件。
注意:Worker线程不同于普通线程的天然限制!!!
Worker线程不允许使用任何的BOM和DOM对象!——浏览器只允许UI主线程渲染页面,操作DOM元素!
Worker线程若想从DOM树上读取数据、或把处理结果显示在DOM树上,不能直接操作DOM元素;但可以给UI主线程发消息,让UI主线程来操作。
UI主线程给Worker线程发消息:
Worker线程给UI主线程发消息:
终止 Web Worker:
当我们创建 web worker 对象后,它会继续监听消息(即使在外部脚本完成之后)直到其被终止为止。
如需终止 web worker,并释放浏览器/计算机资源,请使用 terminate() 方法:
若Web页面中执行了很耗时的JS任务(如加解密、复杂路径计算、多参数计算等),由于所有的HTML/CSS/JS代码都在同一个UI主线程中执行,会导致页面“卡死”。
根本解决办法:创建一个新的并发线程,在新的线程中执行耗时JS任务,让UI主线程继续渲染页面/监听事件。
if(typeof(Worker)!=="undefined"){//检测浏览器是否支持 WebWorker var w = new Worker('x.js'); //H5中创建的新“线程”的语句 }else{ // 不支持 WebWorker 的处理语句 }
注意:Worker线程不同于普通线程的天然限制!!!
Worker线程不允许使用任何的BOM和DOM对象!——浏览器只允许UI主线程渲染页面,操作DOM元素!
Worker线程若想从DOM树上读取数据、或把处理结果显示在DOM树上,不能直接操作DOM元素;但可以给UI主线程发消息,让UI主线程来操作。
UI主线程给Worker线程发消息:
UI主线程: var w = new Worker('x.js'); w.postMessage('stringMsg'); Worker线程: onmessage = function(e){ e.data }
Worker线程给UI主线程发消息:
UI主线程: var w = new Worker('x.js'); w.onmessage = function(e){ e.data } Worker线程: postMessage('stringMsg');
终止 Web Worker:
当我们创建 web worker 对象后,它会继续监听消息(即使在外部脚本完成之后)直到其被终止为止。
如需终止 web worker,并释放浏览器/计算机资源,请使用 terminate() 方法:
w.terminate();
//实例
//index.html
<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
var w,
result = document.getElementById("result");
function startWorker(){
if(typeof(Worker)!=="undefined"){
if(typeof(w) == "undefined"){
w = new Worker("workers.js");
}
w.onmessage = function (event) {
result.innerHTML = event.data;
};
}else{
result.innerHTML = "浏览器不支持WebWorker";
}
}
function stopWorker(){
w.terminate();}
</script>
</body>
</html>
//workers.js
var i=0;
function timedCount(){
i=i+1;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();
相关文章推荐
- HTML5 Web Worker
- HTML5 Web Worker
- HTML5 中工作线程(Web Worker)简介
- HTML5安全风险详析之四:Web Worker攻击
- Silverlight面向客户端,HTML5面向Web
- HTML5-离线存储,Web Worker
- HTML5 Web Worker 学习笔记
- html5 web worker 和serverSend使用
- HTML5 Web Worker的使用
- HTML5 Web Worker深入浅出教程
- html5 多线程处理webWorker
- HTML5 Web Worker的使用方法
- HTML5 使用Web Worker处理线程
- 深入 HTML5 Web Worker 应用实践:多线程编程
- HTML5 Web Worker使用
- Html5 Web worker 不能使用 web sql
- 深入理解JS异步编程四(HTML5 Web Worker)
- HTML5 web Worker 多线程
- HTML5 Web Worker Demo报错 (Uncaught Error: SECURITY_ERR: DOM Exception 18)
- HTML5多线程JavaScript解决方案Web Worker——专用Worker和共享Worker