HTML Web Workers
- Página anterior Caché de Aplicación HTML5
- Página siguiente HTML5 SSE
Web worker 是运行在后台的 JavaScript,不会影响页面的性能。
什么是 Web Worker?
当在 HTML 页面中执行脚本时,页面是不可响应的,直到脚本已完成。
Web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 运行在后台。
浏览器支持
表格中的数字指示完全支持 Web Worker 的首个浏览器版本。
API | |||||
Web Worker | 4.0 | 10.0 | 3.5 | 4.0 | 11.5 |
检测 Web Worker 支持
在创建 web worker 之前,请检测用户浏览器是否支持它:
if (typeof(Worker) !== "undefined") { // 是的!支持 Web worker! // 一些代码..... } // 抱歉!不支持 Web Worker! }
创建 Web Worker 文件
Ahora, creemos nuestro web worker en un archivo JavaScript externo.
Aquí creamos el script de conteo. Este script se almacena en el archivo "demo_workers.js":
var i = 0; function timedCount() { i = i + 1; postMessage(i); setTimeout("timedCount()",500); } timedCount();
La parte importante del código anterior es el método postMessage() - se utiliza para enviar un mensaje a la página HTML.
Comentarios: El web worker generalmente no se utiliza para scripts tan simples, sino para tareas que requieren más recursos de CPU.
Crear objeto Web Worker
Ahora que tenemos el archivo web worker, necesitamos invocarlo desde la página HTML.
La siguiente línea de código verifica si existe el worker; si no existe, - crea un nuevo objeto web worker y ejecuta el código en "demo_workers.js":
if (typeof(w) == "undefined") { w = new Worker("demo_workers.js"); }
Luego podemos recibir mensajes desde y hacia el web worker.
Añadir un listener de eventos "onmessage" al web worker:
w.onmessage = function(event){ document.getElementById("result").innerHTML = event.data; };
Cuando el web worker transmite un mensaje, ejecuta el código en el listener de eventos. Los datos del web worker se almacenan en event.data.
Terminar Web Worker
Después de crear un web worker, seguirá escuchando mensajes (incluso después de que el script externo se complete) hasta que se终止.
Para terminar el web worker y liberar recursos del navegador/computadora, utilice el método terminate():
w.terminate();
Reutilización de Web Worker
Si establece la variable worker en undefined, puede reutilizar el código después de que se终止:
w = undefined;
Código completo de ejemplo de Web Worker
Hemos visto el código del Worker en el archivo .js. A continuación, se muestra el código de la página HTML:
Ejemplo
<!DOCTYPE html> <html> <body> <p>Contar números: <output id="result"></output></p> <button onclick="startWorker()">Iniciar Worker</button> <button onclick="stopWorker()">Detener Worker</button> <br><br> <script> var w; function startWorker() { if(typeof(Worker) !== "undefined") { if(typeof(w) == "undefined") { w = new Worker("demo_workers.js"); } w.onmessage = function(event) { document.getElementById("result").innerHTML = event.data; }; } document.getElementById("result").innerHTML = "¡Lamentamos! No hay soporte para Web Worker."; } } function stopWorker() { w.terminate(); w = undefined; } </script> </body> </html>
Web Worker y DOM
Dado que los web worker se encuentran en archivos externos, no pueden acceder a los siguientes objetos JavaScript:
- Objeto window
- Objeto document
- Objeto parent
- Página anterior Caché de Aplicación HTML5
- Página siguiente HTML5 SSE