2010-04-18 43 views
6

Tôi đang thử nghiệm với html5 và tôi có một hình ảnh nhỏ thả xuống, người dùng chọn và hình ảnh và nó vẽ nó vào canvas bằng cách sử dụng drawImage();html5, thêm một trình xử lý sự kiện vào một hình ảnh được vẽ trên canvas

Tôi không thể tìm ra cách thêm trình xử lý sự kiện vào hình ảnh mới được vẽ trên canvas.

Tôi đã thử đặt nó trong một biến như sau:

var newImg = ctx.drawImage(myImage, 200, 200); 

và sau đó thêm một eventlistener đó, nhưng nó dường như không làm việc.

newImg.addEventListener('mousedown', onImgClick, false); 

Cách chính xác để thực hiện điều này là gì.

Trả lời

5

Canvas không phải là retained-mode bề mặt vẽ. Nó chỉ là một hình ảnh phẳng; không có đối tượng bên trong nó để ràng buộc các sự kiện, và drawImage không trả về gì cả.

Bạn sẽ phải phát hiện các nhấp chuột trên <canvas> và kiểm tra xem chúng có nằm trong hình chữ nhật [200, 200, 200 + w, 200 + h] theo cách thủ công hay không. Hoặc, nếu bạn muốn vẽ chế độ được giữ lại, hãy xem xét sử dụng SVG thay vì canvas.

+0

Tôi bị nhầm lẫn bởi điều này, bởi vì có vẻ như có nhiều hướng dẫn về cách thao tác các đối tượng được vẽ trên canvas. Thậm chí còn có thư viện trò chơi javascript sử dụng canvas. http://www.kesiev.com/akihabara/ Vì vậy, có vẻ như bạn có thể thao tác những hình ảnh bạn đưa vào canvas. – pfunc

+2

Bạn có thể vẽ một vòng tròn trên một khung hình thật, nhưng sau đó chỉ có sơn. Bạn không thể nhặt vòng tròn đó và đưa nó trở lại khỏi khung hình; bạn không thể di chuyển nó lên trên một phần khác của bức tranh; * nó chỉ vẽ *. Bạn có thể áp dụng các đối tượng như hình ảnh, đường dẫn và văn bản vào một ''. Nhưng một khi bạn có, những đồ vật đó không có bất kỳ bản sắc hay sự tồn tại nào; * nó chỉ là điểm ảnh *. Thư viện trò chơi thường giữ danh sách các đối tượng cấp cao hơn để vẽ và vẽ chúng trở lại trên khung hình mới trên mỗi khung hình mới. – bobince

7

Nếu bạn đang tìm kiếm loại tương tác này, <canvas> có lẽ không phải là những gì bạn muốn. Bạn đang tìm kiếm SVG. Có một thư viện tuyệt vời được gọi là Raphaël mà làm việc với SVG một miếng bánh trên tất cả các trình duyệt, ngay cả trên IE6. Nó cũng hoàn toàn tương thích với jQuery, vì vậy bạn có thể làm:

var paper = Raphael(10, 50, 320, 200); 
var img = paper.image("/path/to/img.png", 10, 10, 80, 80); 
$(img).click(onImgClick); 

tôi khá chắc chắn điều này sẽ đối xử với bạn tốt hơn và dễ dàng hơn để sử dụng hơn <canvas>.

Lưu ý: Raphaël đi kèm với một số người trợ giúp cho các sự kiện cơ bản như "nhấp" và "mousedown", chỉ cần img.click(onImgClick), nhưng nếu bạn đã sử dụng thư viện như jQuery, bạn có thể nhất quán và sử dụng xử lý sự kiện của thư viện.

+0

ahh, rất vui được biết.Tôi nghĩ rằng đó có thể là trường hợp, nhưng tôi cũng nghĩ vì tôi có thể nhìn thấy img được thêm vào trong nguồn tôi có thể điều khiển nó. – pfunc

+0

sự khác biệt là '' chỉ thêm pixel khi bạn vẽ một hình ảnh. SVG dựa trên đánh dấu, như HTML, vì vậy có một đoạn đánh dấu thực sự được thêm vào cơ bản giống như bất kỳ phần tử HTML DOM nào, vì vậy bạn có thể tương tác với nó, sao chép, di chuyển, biến đổi và nghe các sự kiện trên đó. Có đôi khi một chi phí hiệu suất từ ​​này, so với ' ', tuy nhiên, nhưng nó sẽ làm việc tuyệt vời cho tình hình bạn mô tả. – bcherry

+0

tuyệt. Đã bắt đầu làm việc với nó và nó khá đơn giản. Và tôi lấy lại nó, tôi không thể nhìn thấy nguồn img trong phần tử canvas, tôi đã có một số mã còn sót lại trong đó từ một bài kiểm tra trước đó. Cảm ơn bạn. – pfunc

0

Để thực hiện điều này mà không cần sự giúp đỡ của JS:

Mặc dù bạn không thể đính kèm một event listener với bối cảnh mà bạn gọi drawImage(); bạn CÓ THỂ đính kèm người nghe sự kiện vào Canvas chính nó.

myCanvasElement = document.getElementById('canvasElement'); 
myCanvasElement.addEventListener("click", someFunction, false); 

Nếu bạn cần có hình ảnh này mà bạn vẽ, bạn có thể chồng các đối tượng canvas và tạo đối tượng mới cho mỗi hình ảnh bạn vẽ.

+1

vẫn là JS bạn đang sử dụng ở đây ... (@ "Để làm điều này mà không cần sự trợ giúp của JS: ...") – Peter

Các vấn đề liên quan