Web Workers能在后台进程中运行的方法.
Web Workers 进程能够在不影响用户界面的情况下处理任务,并且,它还可以使用 XMLHttpRequest 来处理 I/O,但通常,后台进程(包括 Web Workers 进程)不能对 DOM 进行操作。如果希望后台程序处理的结果能够改变 DOM,只能通过返回消息给创建者的回调函数进行处理。
- 主线程中创建 Worker 实例,并监听 onmessage 事件
1
function init(){ var worker = new Worker('compute.js'); worker.onmessage= function (event) { console.log(event.data) }; }
在客户端的 compute.js 中,只是简单的重复多次加和操作,最后通过 postMessage 方法把结果返回给主线程。而在这段时间内,主线程不被阻塞,用户可以通过拖拽浏览器,变大缩小浏览器窗口等操作测试这一现象。
compute.js 中调用 postMessage 方法返回计算结果
1
var i=0; function timedCount(){ for(var j=0,sum=0;j<100;j++){ for(var i=0;i<100000000;i++){ sum+=i; } } // 调用 postMessage 向主线程发送消息 postMessage(sum); } postMessage("Before computing,"+new Date()); timedCount(); postMessage("After computing,"+new Date());
父页面中嵌入子页面,调用 postMessage 方法发送数据
1
function sendIt(){ // 通过 postMessage 向子窗口发送数据 document.getElementById("otherPage").contentWindow .postMessage( document.getElementById("message").value, "http://child.com:8080" ); } <!-- 通过 iframe 嵌入子页面 --> <iframe src="//child.com:8080/TestHTML5/other-domain.html" id="otherPage"></iframe> <input type="text" id="message"> <input type="button" value="Send to child.com" onclick="sendIt()" />
在子窗口中监听 onmessage 事件,并用 JavaScript 实现显示父窗口发送过来的数据。
- 子窗口中监听 onmessage 事件,显示父窗口发送来的数据
```dash
window.addEventListener(“message”, function( event ) {
// 把父窗口发送过来的数据显示在子窗口中
document.getElementById(“content”).innerHTML+=event.data+”
“;
}, false );