Saya seorang programmer Java yang berpengalaman tetapi saya melihat beberapa hal JavaScript / HTML5 untuk pertama kalinya dalam sekitar satu dekade. Saya benar-benar bingung tentang apa yang seharusnya menjadi hal paling sederhana yang pernah ada.
Sebagai contoh, saya hanya ingin menggambar sesuatu dan menambahkan event handler ke dalamnya. Saya yakin saya melakukan sesuatu yang bodoh, tetapi saya sudah mencari di mana-mana dan tidak ada yang disarankan (misalnya jawaban untuk pertanyaan ini: Tambahkan properti onclick untuk diinput dengan JavaScript ) berfungsi. Saya menggunakan Firefox 10.0.1. Kode saya berikut. Anda akan melihat beberapa baris yang dikomentari dan di akhir masing-masing adalah deskripsi tentang apa (atau apa yang tidak) terjadi.
Apa sintaks yang benar di sini? Saya menjadi gila!
<html>
<body>
<canvas id="myCanvas" width="300" height="150"/>
<script language="JavaScript">
var elem = document.getElementById('myCanvas');
// elem.onClick = alert("hello world"); - displays alert without clicking
// elem.onClick = alert('hello world'); - displays alert without clicking
// elem.onClick = "alert('hello world!')"; - does nothing, even with clicking
// elem.onClick = function() { alert('hello world!'); }; - does nothing
// elem.onClick = function() { alert("hello world!"); }; - does nothing
var context = elem.getContext('2d');
context.fillStyle = '#05EFFF';
context.fillRect(0, 0, 150, 100);
</script>
</body>
onclick
sebagai gantionClick
alert()
langsung<script>
, alih-alih mendefinisikan fungsi yang akan memanggilalert()
. Sisanya tidak melakukan apa-apa karena kapitalisasionclick
.Jawaban:
Saat Anda menggambar suatu
canvas
elemen, Anda hanya menggambar bitmap dalam mode langsung .The elemen (bentuk, garis, gambar) yang diambil tidak memiliki perwakilan selain piksel yang mereka gunakan dan warna mereka.
Oleh karena itu, untuk mendapatkan acara klik pada
canvas
elemen (bentuk), Anda perlu menangkap acara klik padacanvas
elemen HTML dan menggunakan beberapa matematika untuk menentukan elemen mana yang diklik, asalkan Anda menyimpan lebar / tinggi elemen dan offset x / y elemen .Untuk menambahkan
click
acara kecanvas
elemen Anda , gunakan ...Untuk menentukan elemen mana yang diklik ...
jsFiddle .
Kode ini melampirkan
click
peristiwa kecanvas
elemen, dan kemudian mendorong satu bentuk (disebutelement
kode saya) keelements
array. Anda dapat menambahkan sebanyak yang Anda inginkan di sini.Tujuan membuat array objek adalah agar kami dapat menanyakan properti mereka nanti. Setelah semua elemen didorong ke dalam array, kita lewati dan render masing-masing berdasarkan propertinya.
Ketika
click
acara dipicu, kode akan melewati elemen dan menentukan apakah klik di atas salah satu elemen dalamelements
array. Jika demikian, ini akan mengaktifkanalert()
, yang dapat dengan mudah dimodifikasi untuk melakukan sesuatu seperti menghapus item array, dalam hal ini Anda memerlukan fungsi render terpisah untuk memperbaruicanvas
.Untuk kelengkapan, mengapa upaya Anda tidak berhasil ...
Ini menugaskan nilai kembali
alert()
keonClick
properti darielem
. Segera memohonalert()
.Dalam JavaScript,
'
dan"
secara semantik identik, lexer mungkin menggunakan['"]
tanda kutip.Anda menetapkan string ke
onClick
properti darielem
.JavaScript peka huruf besar-kecil. The
onclick
properti adalah metode kuno melampirkan event handler. Ini hanya memungkinkan satu acara untuk dilampirkan dengan properti dan acara dapat hilang ketika membuat serial HTML.Lagi
' === "
,.sumber
Mungkin sangat terlambat untuk jawabannya tetapi saya baru saja membaca ini sambil mempersiapkan
70-480
ujian saya , dan ternyata ini berhasil -Perhatikan acara itu sebagai
onclick
gantionClick
.Contoh JS Bin .
sumber
Saya merekomendasikan artikel berikut: Hit Deteksi Wilayah Untuk Kanvas HTML5 Dan Cara Mendengarkan Klik Acara Pada Bentuk Kanvas yang melewati berbagai situasi.
Namun, itu tidak mencakup
addHitRegion
API, yang harus menjadi cara terbaik (menggunakan fungsi matematika dan / atau perbandingan cukup rentan kesalahan). Pendekatan ini dirinci pada developer.mozillasumber
addHitRegion
] sudah usang. Meskipun mungkin masih berfungsi di beberapa browser, penggunaannya tidak disarankan karena dapat dihapus kapan saja. Cobalah untuk menghindari menggunakannya." - dari tautan dev.moz yang Anda sertakan, untuk menyimpan klik orang lain.Sebagai alternatif jawaban alex:
Anda bisa menggunakan gambar SVG alih-alih gambar Kanvas. Di sana Anda dapat menambahkan acara langsung ke objek DOM yang ditarik.
lihat misalnya:
Membuat objek gambar svg dapat diklik dengan onclick, menghindari penentuan posisi absolut
sumber
Anda juga dapat menempatkan elemen DOM, seperti
div
di atas kanvas yang akan mewakili elemen kanvas Anda dan diposisikan dengan cara yang sama.Sekarang Anda dapat melampirkan pendengar acara ke div ini dan menjalankan tindakan yang diperlukan.
sumber
Sebagai alternatif murah lain pada kanvas agak statis, menggunakan elemen img overlay dengan definisi usemap cepat dan kotor. Bekerja sangat baik pada elemen kanvas berbasis poligon seperti diagram lingkaran.
sumber
Jawaban Alex cukup rapi tetapi ketika menggunakan rotate konteks bisa sulit untuk melacak koordinat x, y, jadi saya telah membuat Demo yang menunjukkan cara melacaknya.
Pada dasarnya saya menggunakan fungsi ini & memberinya sudut & jumlah jarak yang ditempuh malaikat itu sebelum menggambar objek.
sumber