How can I use Web Workers in HTML5?

Web Workers allow for long-running scripts that are not interrupted by scripts that respond to clicks or other user interactions and allows long tasks to be executed without yielding to keep the page responsive.

Web Workers are background scripts and they are relatively heavyweight and are not intended to be used in large numbers. For example, it would be inappropriate to launch one worker for each pixel of a four-megapixel image.

Web Workers are initialized with the URL of a JavaScript file, which contains the code the worker will execute. This code sets event listeners and communicates with the script that spawned it from the main page.

Syntax

Following is the basic syntax to create a Web Worker:

var worker = new Worker('worker-script.js');

Creating Your First Web Worker

Let's create a simple example with a worker that performs a time-consuming calculation.

Main HTML file:

<!DOCTYPE html>
<html>
<head>
    <title>Web Worker Example</title>
</head>
<body>
    <button id="startWorker">Start Worker</button>
    <button id="stopWorker">Stop Worker</button>
    <div id="result"></div>

    <script>
        let worker;
        
        document.getElementById('startWorker').onclick = function() {
            if (typeof(Worker) !== "undefined") {
                if (typeof(worker) == "undefined") {
                    worker = new Worker("/js/worker.js");
                }
                
                // Send data to worker
                worker.postMessage(100000);
                
                // Listen for messages from worker
                worker.onmessage = function(event) {
                    document.getElementById("result").innerHTML = "Result: " + event.data;
                };
                
                // Handle errors
                worker.onerror = function(error) {
                    console.log("Worker error: " + error.message);
                };
            } else {
                document.getElementById("result").innerHTML = "Web Workers not supported!";
            }
        };
        
        document.getElementById('stopWorker').onclick = function() {
            if (worker) {
                worker.terminate();
                worker = undefined;
            }
        };
    </script>
</body>
</html>

Worker script (worker.js):

// This code runs in the worker thread
onmessage = function(event) {
    let number = event.data;
    let result = 0;
    
    // Simulate heavy computation
    for (let i = 0; i 

Key Web Worker Methods

Method/Property Purpose Usage
new Worker() Create worker new Worker('script.js')
postMessage() Send data worker.postMessage(data)
onmessage Receive data worker.onmessage = function(e){...}
terminate() Stop worker worker.terminate()

Advanced Example with Progress Updates

Here's a more advanced example showing progress updates during a long-running task:

<!DOCTYPE html>
<html>
<body>
    <button onclick="startTask()">Start Long Task</button>
    <div id="progress"></div>
    
    <script>
        function startTask() {
            const worker = new Worker('/js/progress-worker.js');
            
            worker.postMessage({start: 0, end: 1000000});
            
            worker.onmessage = function(e) {
                if (e.data.type === 'progress') {
                    document.getElementById('progress').innerHTML = 
                        'Progress: ' + e.data.percent + '%';
                } else if (e.data.type === 'complete') {
                    document.getElementById('progress').innerHTML = 
                        'Completed! Result: ' + e.data.result;
                    worker.terminate();
                }
            };
        }
    </script>
</body>
</html>

Progress worker script (progress-worker.js):

onmessage = function(e) {
    const {start, end} = e.data;
    let sum = 0;
    
    for (let i = start; i <= end; i++) {
        sum += i;
        
        // Send progress updates every 10000 iterations
        if (i % 10000 === 0) {
            const percent = Math.round((i / end) * 100);
            postMessage({type: 'progress', percent: percent});
        }
    }
    
    // Send final result
    postMessage({type: 'complete', result: sum});
};

Browser Compatibility

Web Workers are supported in all modern browsers including Chrome, Firefox, Safari, and Edge. Always check for support before using:

if (typeof(Worker) !== "undefined") {
    // Web Workers supported
} else {
    // Fallback for older browsers
}

Key Points

  • Web Workers run in separate threads and don't block the main UI
  • Communication happens via postMessage() and onmessage
  • Workers cannot access DOM directly
  • Always terminate workers when done to free memory
  • Use for CPU-intensive tasks like data processing or calculations

Conclusion

Web Workers provide an excellent way to perform heavy computations without blocking the user interface. Use them for CPU-intensive tasks while keeping the main thread responsive for user interactions.

Updated on: 2026-03-15T23:18:59+05:30

210 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements