How to use multiple click event on HTML5 canvas?

HTML5 canvas allows handling multiple click events by using Path2D objects to define different clickable regions. When a canvas contains multiple shapes or areas, each region can trigger different functions based on where the user clicks. The isPointInPath() method determines which specific path was clicked.

Syntax

Following is the syntax for creating Path2D objects −

var path = new Path2D();
path.arc(x, y, radius, startAngle, endAngle);

Following is the syntax for checking if a point is within a path −

context.isPointInPath(path, x, y);

How Multiple Click Events Work

Multiple click events on canvas work by creating separate Path2D objects for each clickable region. When a user clicks the canvas, the click coordinates are tested against each path using isPointInPath(). The path that contains the click point triggers its corresponding function.

Canvas Multiple Click Events Flow User Click (x, y) Test Against All Paths Execute Function Path1 Path2 Path3 Each path can trigger different functions

Basic Example − Two Clickable Regions

Following example creates a canvas with two semicircle regions that respond to different click events −

<!DOCTYPE html>
<html>
<head>
   <title>Multiple Click Events on Canvas</title>
</head>
<body style="font-family: Arial, sans-serif; padding: 10px;">
   <canvas id="myCanvas" width="400" height="200" style="border: 1px solid #ccc;"></canvas>
   <p id="result">Click on the red or grey semicircle</p>
   
   <script>
      var canvas = document.getElementById('myCanvas');
      var ctx = canvas.getContext('2d');
      
      // Create Path2D objects for different regions
      var redPath = new Path2D();
      var greyPath = new Path2D();
      
      // Define the red semicircle (right half)
      redPath.arc(200, 100, 60, -0.5 * Math.PI, 0.5 * Math.PI);
      
      // Define the grey semicircle (left half)  
      greyPath.arc(200, 100, 60, 0.5 * Math.PI, 1.5 * Math.PI);
      
      // Draw the red semicircle
      ctx.fillStyle = '#d43030';
      ctx.fill(redPath);
      
      // Draw the grey semicircle
      ctx.fillStyle = '#b8b8b8';
      ctx.fill(greyPath);
      
      // Add click event listener
      canvas.addEventListener('click', function(event) {
         var rect = canvas.getBoundingClientRect();
         var x = event.clientX - rect.left;
         var y = event.clientY - rect.top;
         
         if (ctx.isPointInPath(redPath, x, y)) {
            document.getElementById('result').textContent = 'Red semicircle clicked!';
         } else if (ctx.isPointInPath(greyPath, x, y)) {
            document.getElementById('result').textContent = 'Grey semicircle clicked!';
         } else {
            document.getElementById('result').textContent = 'Clicked outside both regions';
         }
      });
   </script>
</body>
</html>

The output shows two semicircles that respond to clicks with different messages −

[Canvas with red and grey semicircles]
Click messages change based on which region is clicked

Advanced Example − Multiple Shapes with Different Functions

Following example demonstrates multiple clickable shapes, each triggering different functions −

<!DOCTYPE html>
<html>
<head>
   <title>Multiple Shapes Click Events</title>
</head>
<body style="font-family: Arial, sans-serif; padding: 10px;">
   <canvas id="shapesCanvas" width="500" height="300" style="border: 2px solid #333;"></canvas>
   <p id="shapeResult">Click on any shape to see the action</p>
   
   <script>
      var canvas = document.getElementById('shapesCanvas');
      var ctx = canvas.getContext('2d');
      
      // Create different Path2D objects
      var circlePath = new Path2D();
      var rectanglePath = new Path2D();
      var trianglePath = new Path2D();
      
      // Define shapes
      circlePath.arc(100, 100, 40, 0, 2 * Math.PI);
      rectanglePath.rect(200, 60, 80, 80);
      trianglePath.moveTo(350, 60);
      trianglePath.lineTo(400, 140);
      trianglePath.lineTo(300, 140);
      trianglePath.closePath();
      
      // Draw circle
      ctx.fillStyle = '#e74c3c';
      ctx.fill(circlePath);
      ctx.strokeStyle = '#c0392b';
      ctx.stroke(circlePath);
      
      // Draw rectangle
      ctx.fillStyle = '#3498db';
      ctx.fill(rectanglePath);
      ctx.strokeStyle = '#2980b9';
      ctx.stroke(rectanglePath);
      
      // Draw triangle
      ctx.fillStyle = '#2ecc71';
      ctx.fill(trianglePath);
      ctx.strokeStyle = '#27ae60';
      ctx.stroke(trianglePath);
      
      // Functions for different shapes
      function circleClicked() {
         document.getElementById('shapeResult').textContent = 'Circle clicked! Area = ? × r² = ' + Math.round(Math.PI * 40 * 40);
      }
      
      function rectangleClicked() {
         document.getElementById('shapeResult').textContent = 'Rectangle clicked! Area = 80 × 80 = 6400';
      }
      
      function triangleClicked() {
         document.getElementById('shapeResult').textContent = 'Triangle clicked! Base = 100, Height = 80';
      }
      
      // Click event handler
      canvas.addEventListener('click', function(event) {
         var rect = canvas.getBoundingClientRect();
         var x = event.clientX - rect.left;
         var y = event.clientY - rect.top;
         
         if (ctx.isPointInPath(circlePath, x, y)) {
            circleClicked();
         } else if (ctx.isPointInPath(rectanglePath, x, y)) {
            rectangleClicked();
         } else if (ctx.isPointInPath(trianglePath, x, y)) {
            triangleClicked();
         } else {
            document.getElementById('shapeResult').textContent = 'Clicked on empty canvas area';
         }
      });
   </script>
</body>
</html>

Each shape responds with different calculations and information when clicked −

[Canvas showing red circle, blue rectangle, and green triangle]
Different messages appear based on which shape is clicked

Using Arrays to Manage Multiple Paths

For complex applications with many clickable regions, storing paths in arrays with corresponding functions makes the code more maintainable −

<!DOCTYPE html>
<html>
<head>
   <title>Array-based Path Management</title>
</head>
<body style="font-family: Arial, sans-serif; padding: 10px;">
   <canvas id="arrayCanvas" width="400" height="200" style="border: 1px solid #666;"></canvas>
   <p id="arrayResult">Click on any colored rectangle</p>
   
   <script>
      var canvas = document.getElementById('arrayCanvas');
      var ctx = canvas.getContext('2d');
      
      // Array to store path objects and their properties
      var clickableRegions = [];
      
      // Define colors and positions
      var colors = ['#e74c3c', '#f39c12', '#2ecc71', '#3498db'];
      var positions = [50, 130, 210, 290];
      
      // Create rectangles and store in array
      for (var i = 0; i < 4; i++) {
         var path = new Path2D();
         path.rect(positions[i], 60, 60, 80);
         
         clickableRegions.push({
            path: path,
            color: colors[i],
            name: 'Rectangle ' + (i + 1),
            onClick: function(index) {
               return function() {
                  document.getElementById('arrayResult').textContent = 
                     'Clicked on ' + clickableRegions[index].name + ' (Color: ' + clickableRegions[index].color + ')';
               };
            }(i)
         });
         
         // Draw the rectangle
         ctx.fillStyle = colors[i];
         ctx.fill(path);
         ctx.strokeStyle = '#2c3e50';
         ctx.stroke(path);
      }
      
      // Single click handler for all regions
      canvas.addEventListener('click', function(event) {
         var rect = canvas.getBoundingClientRect();
         var x = event.clientX - rect.left;
         var y = event.clientY - rect.top;
         
         // Check each region
         for (var i = 0; i < clickableRegions.length; i++) {
            if (ctx.isPointInPath(clickableRegions[i].path, x, y)) {
               clickableRegions[i].onClick();
               return;
            }
         }
         
         document.getElementById('arrayResult').textContent = 'Clicked on empty area';
      });
   </script>
</body>
</html>

This approach scales well for applications with many interactive elements −

[Canvas with four colored rectangles in a row]
Clicking each rectangle shows its name and color information

Key Points

Following are the essential points for implementing multiple click events on HTML5 canvas −

  • Path2D Objects − Use separate Path2D instances for each clickable region to define boundaries clearly.

  • Event Coordinates − Always convert mouse click coordinates relative to canvas position using getBoundingClientRect().

  • Hit Testing − Use isPointInPath() method to determine if click coordinates fall within a specific path.

  • Order Matters − Test paths in the desired priority order, as the first matching path will handle the event.

  • Array Management − Store paths in arrays with associated functions for better organization in complex applications.

Conclusion

Multiple click events on HTML5 canvas are implemented using Path2D objects to define clickable regions and the isPointInPath() method for hit detection. This approach allows creating interactive canvas applications where different areas respond to user clicks with specific functions, making it ideal for games, interactive diagrams, and complex user interfaces.

Updated on: 2026-03-16T21:38:53+05:30

508 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements