Browser Event
Untuk
dapat menghasilkan dokumen HTML yang menarik, modifikasi elemen-elemen dalam
dokumen saja tentu tidak cukup. Terkadang kita memerlukan dokumen yang
interaktif; yang memberikan respon terhadap masukan dari pengguna. Terdapat
banyak jenis masukan dari pengguna yang dapat diakses oleh browser. Penekanan
tombol keyboard adalah masukan. Klik tombol mouse juga adalah masukan.
Bahkan pergerakan mouse juga dapat dihitung sebagai masukan.
Berbagai masukan dari pengguna ini dibaca dan dipantau oleh browser agar
kita dapat mengambil tindakan ketika pengguna memberikan masukan. Karena
masukan dianggap sebagai sesuatu yang dilakukan pengguna, atau dengan kata lain
kejadian ketika dokumen HTML ditampilkan, maka hasil rekaman peristiwa ini
dikenal dengan nama event.
Cara
kerja dari browser event sendiri sangat sederhana. Browser memberikan
kita fasilitas untuk memantau kejadian tertentu pada elemen DOM tertentu. Kita
kemudian dapat memberikan sebuah fungsi kepada browser, yang
nantinya dipanggil ketika peristiwa yang dipantau terjadi. Untuk beberapa
peristiwa, misalnya penekanan tombol keyboard seringkali kita akan memerlukan
informasi tambahan seperti tombol apa yang ditekan pengguna. Untuk
mengakomodasi hal ini browser memberikan objek khusus untuk event yang
dapat kita akses melalui fungsi yang kita berikan ke pemantau kejadian.
Perlu
diketahui juga bahwa event dijalankan dari elemen yang paling
dalam dari DOM, dan kemudian bergerak naik terus sampai ke elemen paling atas
dari DOM (body). Misalkan kita memiliki elemen seperti berikut:
1
2
3
4
5
6
|
<p>Sebuah
paragraf dengan list di dalamnya.
<ul>
<li>List
pertama</li>
<li><a href="http://google.com">List
kedua</a></li>
</ul>
</p>
|
Jika
pengguna melakukan klik pada teks “List kedua” pada elemen HTML di atas,
maka browser terlebih dahulu akan menjalankan event yang
ada pada elemen a. Jika kita tidak memantau elemen
tersebut, maka browser akan mengecekevent pada
elemen li, dan seterusnya sampai kepada
elemen p dan akhirnya elemen teratas, body. Jika pada
elemenbody juga tidak terdapat event yang
dipantau, maka browser akan menjalankan fungsi standar browser.
Dalam contoh di atas, browser akan bergerak ke alamat http://google.com. Pola
pergerakan event seperti ini kita kenal dengan namaevent
bubbilg atau bubbing phrase.
Seperti
yang dapat dilihat sejauh ini, event dalam DOM cukup sederhana
dan mudah. Pada dasarnya, untuk menambahkan interaktifitas dalam dokumen HTML
kita cukup melakukan dua langkah saja:
- Buat fungsi
yang ingin dipanggil ketika event terjadi.
- Kaitkan
elemen DOM dengan event yang diinginkan, beserta dengan
fungsi yang dibuat pada langkah pertama.
Secara umum, browser menyediakan
lima fasilitas khusus berkaitan dengan event, yaitu fasilitas
untuk:
- Mendaftarkan
pemantau event.
- Mengambil
objek event.
- Mengambil
informasi dari objek event.
- Memberikan
informasi ke browser bahwa event telah
selesai ditangani.
- Menghapus
(melepaskan) pemantau event.
Kelima fasilitas yang ada ini sangat
mudah digunakan, walaupun sayangnya beberapa browser mengimplementasikan
semuanya dengan cara yang berbeda-beda. Seperti biasa, pembahasan akan kita
lakukan hanya untuk browser berbasis Webkit dan Gecko.
Pemantauan Event
Untuk
melihat bagaimana kita dapat memantau event pada sebuah elemen
DOM, kita akan bekerja dengan sebuah dokumen sederhana yang memiliki tulisan
dan tombol, seperti berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<!doctype
html>
<html>
<head>
<meta charset="UTF-8">
<title>Event
dalam Browser</title>
</head>
<body>
<h1 id="judul">Judul
Bab Dokumen</h1>
<p>
<a href="http://www.google.com" id="link">
Link ke Google
</a>
</p>
<input type="button"
id="btnJudul"
value="Ganti
Warna Judul Bab">
<input type="button"
id="btnLink"
value="Ganti
Warna Link">
<script
type="text/javascript" src="script.js"></script>
</body>
</html>
|
Untuk mengaitkan pemantau event ke
salah satu elemen, kita dapat memanggil method addEventListener milik
elemen tersebut. addEventListener merupakan method milik
objek yang mengimplementasikan antarmuka EventTarget.EventTarget sendiri
diimplementasikan oleh seluruh elemen HTML dan beberapa objek khusus lainnya
(misal:XMLHttpRequest). addEventListener menerima tiga buah argumen, yaitu:
- Argumen
pertama merupakan string yang berisi teks dari nama event yang
ingin dipantau.
- Argumen
kedua menerima objek, atau tepatnya fungsi, yang ingin dijalankan
ketika event terjadi.
- Argumen
ketiga yaitu sebuah nilai boolean yang menandakan apakah bubbling
phrase harus dijalankan dengan normal (dari dalam ke luar) atau
sebaliknya (dari luar ke dalam). Nilai false berarti bubbling phrase berjalan normal,
sementara true berarti bubbling phrase berjalan
terbalik. Argumen ketiga ini bersifat opsional (tidak harus diisikan).
Jika tidak diisikan bubbling phrase akan berjalan normal
(nilai false).
Pada umumnya kita hanya akan menggunakan
parameter pertama dan kedua, karena masih banyak browser yang
tidak mengimplementasikan argumen ketiga. Langsung saja, misalkan jika kita
ingin melakukan sesuatu ketika tombol “Ganti Warna Judul Bab” di-klik:
1
2
3
4
5
6
7
|
var
tombol = document.getElementById("btnJudul");
var
fungsi = function ()
{
var
jdl = document.getElementById("judul");
jdl.style.color = "#5FF";
};
tombol.addEventListener("click",
fungsi);
|
Kode di atas cukup jelas dan sederhana:
ambil elemen yang tepat (tombol) dan kemudian kaitkan event klik
ke fungsidengan addEventListener. Setelah menjalankan kode di atas,
elemen h1 dengan id judulBab akan
berubah warnanya ketika kita menekan tombol “Ganti Warna Judul Bab”.
Untuk menghilangkan atau membuang
pemantau event sendiri dapat dilakukan dengan mudah,
memanfaatkan fungsiremoveEventListener milik elemen yang bersangkutan.
Fungsi ini memiliki parameter yang sama persis denganaddEventListener.
1
|
tombol.removeEventListener("click",
fungsi);
|
Perhatikan juga bagaimana kita tetap
mengirimkan fungsi ke removeEventListener. Hal ini
berarti kita harus memiliki akses terhadap fungsi dan tombol ketika
memanggil removeEventListener.
Objek Event
Objek Event merupakan
sebuah objek yang dibuat ketika sebuah event berjalan.
Objek Event dapat kita akses melalui fungsi
yang kita kirimkan ke addEventListener:
1
2
3
4
5
6
|
var
aksesEvent = function
(evt) {
// parameter evt
merupakan objek Event
};
//
fungsi aksesEvent akan dapat mengakses objek event
tombol.addEventListener("click", fungsi);
|
Pada kode di atas, kita hanya cukup
menambahkan sebuah parameter ke dalam fungsi yang akan dikirimkan untuk dapat
mengakses Event. Melalui objek ini kita dapat mengakses
berbagai informasi mengenai event yang sedang berjalan.
Misalnya, kita bisa mendapatkan elemen yang sedang berinteraksi dengan pengguna
melalui properti target:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var
link = document.getElementById("link");
var
fungsiLink = function
(event) {
//
karena pengguna melakukan klik terhadap
//
elemen dengan id link, maka kita bisa
//
mengambil elemen tersebut melalui Event.target
var el
= event.target;
el.style.color = "#F43";
el.style.textDecoration = "none";
};
// ketika di-klik, link
akan berubah warna dan
// tidak lagi bergaris
bawah
link.addEventListener("click",
fungsiLink);
|
Sayangnya ketika kode penanganan event di
atas berjalan kita tidak akan dapat melihat perubahan warna dan tampilan teks
karena secara otomatis browser akan berpindah halaman ke
Google. Untuk menangani hal ini, kita bisa memanggilmethod preventDefault yang
berguna untuk membatalkan aksi standar (default) dari elemen DOM:
1
2
3
4
5
6
7
8
9
10
11
12
|
var
link = document.getElementById("link");
var
fungsiLink = function
(event) {
var el
= event.target;
el.style.color = "#F43";
el.style.textDecoration = "none";
//
memaksa elemen link tidak membuat
//
browser berpindah ke halaman lain
event.preventDefault();
};
link.addEventListener("click",
fungsiLink);
|
Sekarang kita bisa melihat bagaimana
objek Event memiliki properti dan method yang
sangat berguna, beserta cara menggunakan fitur-fitur tersebut.
Keseluruhan method dan properti yang dimiliki objek Event tidak
akan kita bahas di sini. Silahkan baca dokumentasi objek Event pada
website yang relevan jika ingin melihat informasi apa saja yang disediakan
oleh Event.
Membuat Event Sendiri
Jika memang diperlukan, kita juga dapat
membuat event milik kita sendiri. Objek CustomEvent digunakan
untuk membuatevent yang kita inginkan. CustomEvent dapat
dibuat dengan memanggil constructor objek, seperti berikut:
1
2
3
4
5
|
var
eventBuatan = new
CustomEvent("eventBuatan", {
detail: {
name: "Event Buatan" },
bubbles: true,
cancelable: true
});
|
Seperti yang dapat dilihat dari kode di
atas, CustomEvent menerima dua buah parameter
untuk constructor-nya, yaitu:
- Nama event yang
kita inginkan, dalam contoh ini eventBuatan.
- Data yang
ingin kita berikan kepada event buatan.
Terdapat tiga data utama yang dapat kita
berikan, yaitu:
- bubbles, nilai boolean yang menentukan apakah event akan
menjalankan bubble phrase atau tidak.
- cancelable, nilai boolean untuk memberikan fitur
pembatalan event melalui method preventDefault danstopPropagation milik objek Event.
- detail, yang merupakan sebuah objek berisi data apapun
yang ingin kita berikan kepada event.
Untuk menggunakan event buatan,
kita dapat mengaitkan event tersebut kepada sebuah elemen DOM,
seperti layaknyaevent bawaan dari browser:
1
2
3
|
link.addEventListener("eventBuatan", function
(event) {
// lakukan sesuatu
ketika eventBuatan terjadi
});
|
Sayangnya, berbeda dengan event bawaan browser, event buatan
kita tidak akan dapat berjalan secara otomatis ketika pengguna melakukan
sesuatu dalam dokumen. Untuk event buatan, kita harus
memanggil method dispatchEvent ketika ingin menjalankan event tersebut. dispatchEvent sendiri
merupakan method milik elemen DOM, sehingga penggunaannya
memerlukan keberadaan elemen DOM yang bersangkutan:
1
|
link.dispatchEvent(eventBuatan);
|
Karena keterbatasan inilah maka dalam
penggunaan di aplikasi biasanya kita menggabungkan event buatan
dengan interaksi antar satu objek dengan objek lain, bukan interaksi antara
pengguna dengan dokumen HTML.
Keindahan Model Event Browser
Model event yang
disediakan oleh DOM sangat sederhana. Tidak hanya sederhana, model yang
diberikan oleh DOM juga sangat berguna. Dengan menggunakan model event milik
DOM, kita mendapatkan akses terhadap aksi pengguna dari berbagai perangkat,
mulai dari PC sampai dengan smartphone! Event memungkinkan
kita untuk mengakses apa yang terjadi, kapan sebuah event terjadi,
dan kemudian menentukan respon kita terhadap event tersebut
dengan sangat mudah. Bagaimana browser mengimplementasikan event tidak
terlalu penting - kita dapat dengan tenang mengahlikan fokus kita ke
pengembangan aplikasi web yang baik.
Abstraksi yang disediakan oleh event seperti
ini sangat patut ditiru. Jika mampu membangun aplikasi dengan
mengimplementasikan konsep-konsep yang ada dalam event, kita akan
mendapatkan kode aplikasi yang sangat rapi dan mudah dirawat. Framework modern
Javascript seperti Backbone.js dan AngularJS banyak menggunakan konsep-konsep
sejenis. Jika tertarik dengan konsep yang digunakan oleh model event seperti
ini, silahkan baca lebih lanjut mengenai pola pengembangan (design pattern)
Observer.
Tidak ada komentar:
Posting Komentar