Khi bạn vẽ đến một canvasphần tử, bạn chỉ cần vẽ một bitmap ở chế độ ngay lập tức .
Các yếu tố (hình dạng, đường thẳng, hình ảnh) được vẽ không có đại diện bên cạnh các pixel chúng sử dụng và màu sắc của chúng.
Do đó, để có được sự kiện nhấp chuột trên một canvas phần tử (hình dạng), bạn cần nắm bắt các sự kiện nhấp chuột trên canvasphần tử HTML và sử dụng một số phép toán để xác định phần tử nào được nhấp, miễn là bạn đang lưu trữ phần tử chiều rộng / chiều cao và x / y của phần tử .
Để thêm một clicksự kiện vào thành canvasphần của bạn , hãy sử dụng ...
canvas.addEventListener('click', function() { }, false);
Để xác định phần tử nào đã được nhấp ...
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 .
Mã này gắn một clicksự kiện vào canvasphần tử và sau đó đẩy một hình dạng (được gọi là elementtrong mã của tôi) vào một elementsmảng. Bạn có thể thêm nhiều như bạn muốn ở đây.
Mục đích của việc tạo ra một mảng các đối tượng là để chúng ta có thể truy vấn các thuộc tính của chúng sau này. Sau khi tất cả các phần tử đã được đẩy lên mảng, chúng tôi lặp lại và kết xuất từng phần tử dựa trên các thuộc tính của chúng.
Khi clicksự kiện được kích hoạt, mã lặp qua các phần tử và xác định xem lần nhấp có vượt qua bất kỳ phần tử nào trong elementsmảng không. Nếu vậy, nó kích hoạt một cái alert(), có thể dễ dàng sửa đổi để làm một cái gì đó như loại bỏ mục mảng, trong trường hợp đó bạn cần một chức năng kết xuất riêng để cập nhật canvas.
Để hoàn thiện, tại sao các nỗ lực của bạn không hoạt động ...
elem.onClick = alert("hello world"); // displays alert without clicking
Này được gán giá trị trả về alert()đến onClicktài sản của elem. Nó ngay lập tức gọi alert().
elem.onClick = alert('hello world'); // displays alert without clicking
Trong JavaScript, 'và "giống hệt nhau về mặt ngữ nghĩa, từ vựng có thể sử dụng ['"]để trích dẫn.
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
Bạn đang gán một chuỗi cho thuộc onClicktính của elem.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript là trường hợp nhạy cảm. Tài onclicksản là phương pháp cổ xưa của việc gắn xử lý sự kiện. Nó chỉ cho phép một sự kiện được gắn với thuộc tính và sự kiện có thể bị mất khi tuần tự hóa HTML.
elem.onClick = function() { alert("hello world!"); }; // does nothing
Một lần nữa , ' === ".
onclickthay vìonClick