zoukankan      html  css  js  c++  java
  • How do I add a simple onClick event handler to a canvas element?

    How do I add a simple onClick event handler to a canvas element?

    When you draw to a canvas element, you are simply drawing a bitmap in immediate mode.

    The elements (shapes, lines, images) that are drawn have no representation besides the pixels they use and their colour.

    Therefore, to get a click event on a canvas element (shape), you need to capture click events on the canvas HTML element and use some math to determine which element was clicked, provided you are storing the elements' width/height and x/y offset.

    To add a click event to your canvas element, use...

    canvas.addEventListener('click', function() { }, false);

    To determine what element was clicked...

    var elem = document.getElementById('myCanvas'),
        elemLeft = elem.offsetLeft,
        elemTop = elem.offsetTop,
        context = elem.getContext('2d'),
        elements = [];
    
    // Add event listener for `click` events.
    elem.addEventListener('click', function(event) {
        var x = event.pageX - elemLeft,
            y = event.pageY - elemTop;
    
        // Collision detection between clicked offset and element.
        elements.forEach(function(element) {
            if (y > element.top && y < element.top + element.height 
                && x > element.left && x < element.left + element.width) {
                alert('clicked an element');
            }
        });
    
    }, false);
    
    // Add element.
    elements.push({
        colour: '#05EFFF',
        width: 150,
        height: 100,
        top: 20,
        left: 15
    });
    
    // Render elements.
    elements.forEach(function(element) {
        context.fillStyle = element.colour;
        context.fillRect(element.left, element.top, element.width, element.height);
    });​

    jsFiddle.

    This code attaches a click event to the canvas element, and then pushes one shape (called an element in my code) to an elements array. You could add as many as you wish here.

    The purpose of creating an array of objects is so we can query their properties later. After all the elements have been pushed onto the array, we loop through and render each one based on their properties.

    When the click event is triggered, the code loops through the elements and determines if the click was over any of the elements in the elements array. If so, it fires an alert(), which could easily be modified to do something such as remove the array item, in which case you'd need a separate render function to update the canvas.

    For completeness, why your attempts didn't work...

    elem.onClick = alert("hello world"); // displays alert without clicking

    This is assigning the return value of alert() to the onClick property of elem. It is immediately invoking the alert().

    elem.onClick = alert('hello world');  // displays alert without clicking

    In JavaScript, the ' and " are semantically identical, the lexer probably uses ['"] for quotes.

    elem.onClick = "alert('hello world!')"; // does nothing, even with clicking

    You are assigning a string to the onClick property of elem.

    elem.onClick = function() { alert('hello world!'); }; // does nothing

    JavaScript is case sensitive. The onclick property is the archaic method of attaching event handlers. It only allows one event to be attached with the property and the event can be lost when serialising the HTML.

    elem.onClick = function() { alert("hello world!"); }; // does nothing

    Again, ' === ".

  • 相关阅读:
    paper 89:视频图像去模糊常用处理方法
    paper 88:人脸检测和识别的Web服务API
    paper 87:行人检测资源(下)代码数据【转载,以后使用】
    paper 86:行人检测资源(上)综述文献【转载,以后使用】
    paper 85:机器统计学习方法——CART, Bagging, Random Forest, Boosting
    paper 84:机器学习算法--随机森林
    paper 83:前景检测算法_1(codebook和平均背景法)
    paper 82:边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny)
    paper 81:HDR成像技术
    paper 80 :目标检测的图像特征提取之(一)HOG特征
  • 原文地址:https://www.cnblogs.com/chucklu/p/11120823.html
Copyright © 2011-2022 走看看