जब आप किसी canvasतत्व को आकर्षित करते हैं, तो आप बस तत्काल मोड में एक बिटमैप खींच रहे हैं ।
तत्वों (आकृतियों, रेखाओं, चित्रों) को खींचा जाता है उनका उपयोग करने वाले पिक्सेल और उनके रंग के अलावा कोई प्रतिनिधित्व नहीं होता है।
इसलिए, किसी तत्व (आकृति) पर एक क्लिक ईवेंट प्राप्त करने के लिए , आपको क्लिक इवेंट को कैप्चर करना होगाcanvas canvas HTML तत्व और यह निर्धारित करने के लिए कुछ गणित का उपयोग करना होगा कि किस तत्व को क्लिक किया गया था, बशर्ते आप तत्वों की चौड़ाई / ऊँचाई और x / y ऑफसेट संग्रहीत कर रहे हों ।
clickअपने canvasतत्व में कोई ईवेंट जोड़ने के लिए , उपयोग करें ...
canvas.addEventListener('click', function() { }, false);
यह निर्धारित करने के लिए कि किस तत्व पर क्लिक किया गया ...
var elem = document.getElementById('myCanvas'),
elemLeft = elem.offsetLeft + elem.clientLeft,
elemTop = elem.offsetTop + elem.clientTop,
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 ।
यह कोड किसी clickईवेंट को canvasएलीमेंट से जोड़ता है , और फिर एक शेप (जिसे elementमेरे कोड में कहा जाता है ) को एक elementsअरै में पुश करता है । आप यहां अपनी इच्छानुसार कई जोड़ सकते हैं।
वस्तुओं की एक सरणी बनाने का उद्देश्य है ताकि हम बाद में उनके गुणों को क्वेरी कर सकें। सभी तत्वों को सरणी पर धकेल दिए जाने के बाद, हम अपने गुणों के आधार पर प्रत्येक के माध्यम से लूप करते हैं और रेंडर करते हैं।
जब clickघटना को ट्रिगर किया जाता है, तो कोड तत्वों के माध्यम से लूप करता है और निर्धारित करता है कि क्या elementsसरणी में किसी भी तत्व पर क्लिक किया गया था । यदि ऐसा है, तो यह आग लगाता है alert(), जिसे आसानी से संशोधित करने के लिए कुछ किया जा सकता है जैसे कि सरणी आइटम को हटा दें, जिस स्थिति में आपको अपडेट करने के लिए एक अलग रेंडर फ़ंक्शन की आवश्यकता होगी canvas।
पूर्णता के लिए, आपके प्रयासों ने काम क्यों नहीं किया ...
elem.onClick = alert("hello world"); // displays alert without clicking
यह alert()की onClickसंपत्ति का रिटर्न मान निर्दिष्ट कर रहा है elem। यह तुरंत आह्वान कर रहा है alert()।
elem.onClick = alert('hello world'); // displays alert without clicking
जावास्क्रिप्ट में, 'और "शब्दार्थ समान हैं, लेक्सर शायद ['"]उद्धरण के लिए उपयोग करता है।
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
आप की onClickसंपत्ति के लिए एक स्ट्रिंग प्रदान कर रहे हैं elem।
elem.onClick = function() { alert('hello world!'); }; // does nothing
जावास्क्रिप्ट संवेदनशील है। onclickसंपत्ति ईवेंट हैंडलर्स संलग्न के पुरातन पद्धति है। यह केवल एक घटना को संपत्ति के साथ संलग्न करने की अनुमति देता है और HTML को क्रमबद्ध करने पर घटना खो सकती है।
elem.onClick = function() { alert("hello world!"); }; // does nothing
फिर, ' === "।
onclickबजाय का उपयोग करेंonClick