Search code examples
htmlcanvasclick

get click event of each rectangle inside canvas?


I dont know how to register click event on each rectangle.

here is the sample:

http://jsfiddle.net/9WWqG/1/


Solution

  • You're basically going to have to track where your rectangles are on the canvas, then set up an event listener on the canvas itself. From there you can take the coordinates of the click event and go through all your rectangles to test for 'collisions'.

    Here's an example of doing just that: http://jsfiddle.net/9WWqG/2/

    html:

    <canvas id="myCanvas" width="300" height="150"></canvas>
    

    javascript:

    // get canvas element.
    var elem = document.getElementById('myCanvas');
    
    function collides(rects, x, y) {
        var isCollision = false;
        for (var i = 0, len = rects.length; i < len; i++) {
            var left = rects[i].x, right = rects[i].x+rects[i].w;
            var top = rects[i].y, bottom = rects[i].y+rects[i].h;
            if (right >= x
                && left <= x
                && bottom >= y
                && top <= y) {
                isCollision = rects[i];
            }
        }
        return isCollision;
    }
    
    // check if context exist
    if (elem && elem.getContext) {
        // list of rectangles to render
        var rects = [{x: 0, y: 0, w: 50, h: 50},
                     {x: 75, y: 0, w: 50, h: 50}];
      // get context
      var context = elem.getContext('2d');
      if (context) {
    
          for (var i = 0, len = rects.length; i < len; i++) {
            context.fillRect(rects[i].x, rects[i].y, rects[i].w, rects[i].h);
          }
    
      }
        
        // listener, using W3C style for example    
        elem.addEventListener('click', function(e) {
            console.log('click: ' + e.offsetX + '/' + e.offsetY);
            var rect = collides(rects, e.offsetX, e.offsetY);
            if (rect) {
                console.log('collision: ' + rect.x + '/' + rect.y);
            } else {
                console.log('no collision');
            }
        }, false);
    }