DOM: Objek dan Koleksi
9.1 Pengantar
Pada bab ini akan dikenalkan mengenai
DOM (Document Object Model). DOM
memberikan Anda akses terhadap semua elemen pada suatu halaman web. Di dalam
penjelajah web, formulir paragraf, tabel, dan lainnya, direpresentasikan pada
sebuah hierarki objek. Dengan menggunakan JavaScript, Anda dapat menciptakan,
memodifikasi, dan menghilangkan elemen-elemen di dalam halaman web secara
dinamis.
Baik Internet Explorer maupun Netscape
memiliki versi HTML dinamis (DHTML) yang berbeda, yang masing-masing
menyediakan fungsionalitas yang sama. Namun, meskipun keduanya memiliki
kapabilitas yang sama, kedua model tersebut tidak kompatibel satu sama lain.
Dalam usaha meningkatkan kompatibilitas lintas-penjelajah, W3C memberlakukan
DOM terstandarisasi. Firefox, IE7, dan banyak penjelajah web lainnya
mengimplementasikan hampir semua fitur DOM dari W3C.
Bab ini akan dimulai dengan secara
formal mengenalkan konsep atas simpul DOM dan pohon DOM. Kemudian akan
didiskusikan pelbagai properti dan metode dari simpul DOM dan akan dirangkum
beberapa metode lain dai objek document.
Di sini akan didiskusikan pula secara dinamis bagaiman mengubah beberapa
properti gaya (style properties),
yang memampukan Anda untuk menciptakan banyak jenis efek, seperti warna latar
belakang dan animasi yang didefinisikan sendiri oleh pengguna.
9.2 Pemodelan sebuah Dokumen: Simpul dan Pohon DOM
Seperti yang telah Anda lihat pada
beberapa bab sebelumnya, metode getElementById
dari objek document merupakan cara
yang paling sederhana untuk mengakses sebuah elemen tertentu di dalam halaman
web.
Metode getElementById menghasilkan objek-objek yang dinamakan dengan
simpul DOM. Setiap elemen pada sebuah halaman XHTML dimodelkan pada penjelajah
web menggunakan simpul DOM. Semua simpul di dalam sebuah dokumen membangun apa
yang dinamakan dengan pohon DOM, yang mendeskripsikan hubungan antar elemen.
Simpul berelasi satu sama lain melalui relasi anak-induk. Sebuah elemen XHTML yang berada di dalam elemen lain dikatakan sebagai anak dari elemen yang memuatnya. Elemen
pemuat dikenal sebagai induk. Sebuah
simpul dapat memiliki banyak anak, tetapi ia hanya bisa memiliki satu induk.
Simpul-simpul dengan induk yang sama disebut sebagai saudara.
Beberapa penjelajah memiliki perangkat
yang memampukan Anda untuk melihat representasi visual atas pohon DOM dari
sebuah dokumen. Ketika menginstal Firefox, Anda dapat memilih untuk menginstal
sebuah perangkat yang dinamakan DOM
Inspector, yang memampukan Anda untuk melihat pohon DOM atas sebuah dokumen
XHTML. Untuk memeriksa sebuah dokumen, pengguna Firefox dapat mengakses DOM Inspector dari menu Tools. Jika DOM Inspector tidak ada pada menu, jalankan installer Firefox dan
pilih Custom pada Setup Type, dan pastikan bahwa kotak DOM Inspector dicentang pada jendela Optional Components.
Microsoft menyediakan sebuah Developer Toolbar untuk Internet
Explorer yang memampukan Anda untuk memeriksa pohon DOM atas sebuah dokumen. Toolbar tersebut dapat diunduh dari Microsoft di alamat go.microsoft.com/fwlink/?LinkId=92716. Begitu toolbar tersebut
diinstal, Anda bisa menjalankan-ulang penjelejah web, kemudian mengklikn ikon
di sisi kanan toolbar dan memilih IE Developer Toolbar dari menu
tersebut. Gambar 9.1 menunjukkan sebuah dokumen XHTML dan pohon DOMnya yang
ditampilkan oleh Developer Toolbar.
Dokumen XHTML memuat beberapa elemen
sederhana. Sebuah simpul dapat diekspansi atau disusutkan menggunakan tombol +
dan – yang berada di samping nama simpul. Gambar 9.1b menunjukkan semua simpul
di dalam dokumen yang diekspansi secara penuh. Simpul dokumen di bagian atas
pohon disebut dengan simpul akar, karena ia tidak memiliki induk. Simpul html merepresentasikan elemen html (baris 7-24).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?xml
version = "1.0" encoding = "utf-8"?>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Gambar 9.1: pohonDOM.html -->
<!--
Demonstrasi atas pohon DOM dari sebuah dokumen. -->
<html xmlns =
"http://www.w3.org/1999/xhtml">
<head>
<title>Demonstrasi Pohon
DOM</title>
</head>
<body>
<h1>Sebuah Halaman XHTML</h1>
<p>Halaman ini memuat
beberapa elemen dasar XHTML. Anda menggunakan
DOM Inspector dari IE Developer
Toolbar untuk melihat pohon DOM
dari dokumen, yang memuat sebuah
simpul DOM untuk setiap elemen
di dalam dokumen.</p>
<p>Berikut adalah sebuah
daftar:</p>
<ul>
<li>Satu</li>
<li>Dua</li>
<li>Tiga</li>
</ul>
</body>
</html>
|
Gambar 9.1a Dokumen XHTML dengan penjelajah Internet Explorer
Gambar 9.1b Demonstrasi atas sebuah pohon DOM dokumen
Simpul head dan body adalah
saudara, karena keduanya merupakan anak dari simpul html. Simpul head memuat satu simpul title, yang merepresentasikan baris 9.
Simpul body memuat simpul-simpul
yang merepresentasikan setiap elemen pada halaman. Perhatikan bahwa
simpul-simpul li merupakan anak dari
simpul ul, karena semuanya bersarang
di dalam simpul ul.
9.3 Menjelajah dan Memodifikasi Pohon DOM
DOM memberikan Anda akses terhadap
elemen-elemen sebuah dokumen, yang memampukan Anda untuk memodifikasi isi
sebuah halaman secara dinamis menggunakan JavaScript event-driven. Bagian ini akan mengenalkan beberapa properti dan metode
dari semua simpul DOM yang memampukan Anda untuk menelusuri pohon DOM, untuk
memodifikasi simpul, dan untuk menghapus isi halaman secara dinamis.
Gambar 9.2 menunjukkan beberapa
fungsionalitas simpul-simpul DOM. Program memampukan Anda untuk menyoroti,
memodifikasi, menyisipkan, dan menghapus elemen.
Baris 117-132 memuat elemen-elemen
dasar XHTML. Setiap elemen memiliki sebuah atribut id, yang juga ditampilkan di awal elemen (di dalam kurung siku).
Sebagai contoh, id dari elemen h1 pada baris 117-118 ditetapkan
sebagai bigheading, dan kepala teks
diawali dengan [bigheading]. Ini
memampukan pengguna untuk melihat id
dari tiap elemen pada halaman. Tubuh juga memuat sebuah elemen h3, beberapa elemen p, dan sebuah list tak-terurut.
Elemen div (baris 133-162) memuat bagian lain dari tubuh XHTML. Baris 134
memulai dengan sebuah elemen form,
menugaskan string kosong kepada atribut action
yang diperlukan (karena Anda tidak memberikannya kepada sebuah server), dan menghasilkan false kepada atribut onsubmit. Ketika onsubmit (dari sebuah form)
menghasilkan false, navigasi yang
diarahkan ke alamat yang ditentukan pada atribut action akan dibatalkan. Ini memampukan Anda untuk memodifikasi
halaman menggunakan menggunakan fungsi penanganan event JavaScript tanpa harus
memuat-ulang XHTML yang asli.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
143
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
<?xml
version = "1.0" encoding = "utf-8"?>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Gambar 9.2: dom.html -->
<!--
Fungsionalitas dasar DOM. -->
<html xmlns =
"http://www.w3.org/1999/xhtml">
<head>
<title>Fungsionalitas
Dasar DOM</title>
<style type =
"text/css">
h1, h3 { text-align: center;
font-family: tahoma,
geneva, sans-serif }
p { margin-left: 5%;
margin-right: 5%;
font-family: arial,
helvetica, sans-serif }
ul { margin-left: 10% }
a { text-decoration: none }
a:hover { text-decoration:
underline }
.nav { width: 100%;
border-top: 3px dashed
blue;
padding-top: 10px }
.highlighted { background-color:
yellow }
.submit { width: 120px }
</style>
<script type =
"text/javascript">
<!--
var simpulSekarang; //
menyimpan simpul tersorot
var hitungId = 0; //
digunakan menugaskan id unik pada
elemen baru
// mendapatkan dan menyoroti
sebuah elemen dengan atribut id
function denganId()
{
var id =
document.getElementById( "gbi" ).value;
var target =
document.getElementById( id );
if ( target )
geserKe( target );
} // akhir fungsi denganId
// menyisipkan sebuah elemen
paragraf sebelum elemen sekarang
// menggunakan metode
insertBefore
function sisip()
{
var simpulBaru =
ciptakanSimpulBaru(
document.getElementById(
"sisip" ).value );
simpulSekarang.parentNode.insertBefore( simpulBaru, simpulSekarang );
geserKe( simpulBaru );
} // akhir fungsi sisip
// menempatkan
sebuah simpul paragraf sebagai anak dari simpul sekarang
function sambungSimpul()
{
var simpulBaru =
ciptakanSimpulBaru(
document.getElementById(
"sambung" ).value );
simpulSekarang.appendChild(
simpulBaru );
geserKe( simpulBaru);
} // akhir fungsi sambungSimpul
// mengganti simpul yang
terseleksi dengan sebuah simpul paragraf
function gantiSekarang()
{
var simpulBaru =
ciptakanSimpulBaru(
document.getElementById(
"ganti" ).value );
simpulSekarang.parentNode.replaceChild( simpulBaru, simpulSekarang );
geserKe( simpulBaru );
} // akhir fungsi gantiSekarang
// menghapus simpul sekarang
function hapus()
{
if (
simpulSekarang.parentNode == document.body )
alert( "Tidak
dapat menghapus elemen level-atas." );
else
{
var simpulLama=
simpulSekarang;
geserKe(
simpulLama.parentNode );
simpulSekarang.removeChild( simpulLama);
} // akhir else
} // akhir fungsi hapus
// mendapatkan dan menyoroti
induk dari simpul sekarang
function induk()
{
var target =
simpulSekarang.parentNode;
if ( target !=
document.body )
geserKe( target );
else
alert( "Tidak ada
simpul induk." );
} // akhir fungsi induk
// fungsi pembantu yang
menghasilkan sebuah simpul paragraf baru
// yang memuat sebuah id unik
function
ciptakanSimpulBaru( teks )
{
var simpulBaru =
document.createElement( "p" );
idSimpul= "baru" +
hitungId;
++hitungId;
simpulBaru.id = idSimpul;
teks = "[" +
idSimpul + "] " + teks;
simpulBaru.appendChild(document.createTextNode( teks ) );
return simpulBaru;
} // akhir fungsi
ciptakanSimpulBaru
// fungsi pembantu yang menggeser
ke simpulSekarang yang baru
function geserKe(
simpulBaru )
{
simpulSekarang.className =
""; // menghapus sorotan
simpulSekarang = simpulBaru;
simpulSekarang.className =
"highlighted"; // menyoroti
simpul baru
document.getElementById(
"gbi" ).value = simpulSekarang.id;
} // akhir fungsi geserKe
// -->
</script>
</head>
<body onload =
"simpulSekarang = document.getElementById( 'bigheading'
)">
<h1 id =
"bigheading" class = "highlighted">
[bigheading] Model Objek DHTML
</h1>
<h3 id =
"smallheading">[smallheading] Fungsionalitas Elemen</h3>
<p id = "para1">[para1]
Model Objek Dokumen (DOM) membuat
akses cepat dan dinamis ke semua
elemen pada sebuah dokumen XHTML
untuk pemanipulasian dengan
JavaScript.</p>
<p id =
"para2">[para2] Agar lebih mengerti, Anda perlu lebih banyak
"belajar JavaScript secara
mandiri, atau kunjungi
<a id =
"link" href = "http://www.javascript.com/javascript">
[link] JavaScript Resource
Center.</a></p>
<p id =
"para3">[para3] Tombol di bawah mendemonstrasikan:(list)</p>
<ul id =
"list">
<li id =
"item1">[item1] getElementById dan parentNode</li>
<li id =
"item2">[item2] sisip dan sambungSimpul</li>
<li id =
"item3">[item3] gantiSekarang dan hapus </li>
</ul>
<div id = "nav" class
= "nav">
<form onsubmit =
"return false" action = "">
<table>
<tr>
<td><input
type = "text" id = "gbi"
value =
"bigheading" /></td>
<td><input
type = "submit" value = "Dengan id"
onclick =
"denganId()" class = "submit" /></td>
</tr><tr>
<td><input
type = "text" id = "sisip" /></td>
<td><input
type = "submit" value = "Sisipkan sebelum"
onclick =
"sisip()" class = "submit" /></td>
</tr><tr>
<td><input
type = "text" id = "sambung" /></td>
<td><input
type = "submit" value = "Sambung Anak"
onclick =
"sambungSimpul()" class = "submit" /></td>
</tr><tr>
<td><input
type = "text" id = "ganti" /></td>
<td><input
type = "submit" value = "Ganti Sekarang"
onclick = "gantingSekarang()" class = "submit"
/></td>
</tr><tr><td
/>
<td><input
type = "submit" value = "Hapus Sekarang"
onclick = "hapus()"
class = "submit" /></td>
</tr><tr><td
/>
<td><input
type = "submit" value = "Dapatkan Induk"
onclick =
"induk()" class = "submit" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
|
Gambar 9.2 Fungsionalitas dasar DOM
Sebuah table ( baris 135-160) memuat beberapa kendali untuk memodifikasi
dan memanipulasi elemen-elemen pada halaman. Setiap tombol (dari keenam tombol)
memanggil fungsi penanganan-event masing-masing untuk melakukan aksi yang
dideskripsikan oleh value.
Kode JavaScript dimulai dengan
mendeklarasikan dua variabel. Variabel simpulSekarang
(baris 27) menjejak simpul tersorot sekarang, karena fungsionalitas dari
tombol-tombol bergantung pada simpul mana yang sedang diseleksi. Atribut onload pada body (baris 116) menginisialisasi simpulSekarang dengan elemen h1
yang memiliki id bigheading.
Variabel hitungId (baris 28) dipakai
untuk menugaskan sebuah id unik
kepada setiap elemen baru yang diciptakan. Kode JavaScript lainnya memuat
fungsi-fungsi penanganan-event untuk tombol-tombol XHTML dan dua fungsi
pembantu yang dipanggil oleh fungsi penanganan-event (event-handler). Sekarang akan dibahas
setiap tombol dan fungsi
penanganan-event terkait secara lebih detil.
Mencari dan Menyoroti sebuah Elemen Menggunakan getElementById
dan className
Baris pertama pada tabel (baris
136-141) memampukan pengguna untuk memasukkan id dari sebuah elemen ke dalam bidang teks (baris 137-138) dan
mengklik tombol Dengan id (baris
139-140) untuk mencari dan menyoroti elemen, seperti yang ditunjukkan pada
Gambar 9.2. Atribut onclick
menetapkan fungsi penanganan-event untuk tombol tersebut agar memanggil denganId().
Fungsi denganId didefinisikan pada baris 31-38. Baris 33 menggunakan getElementById untuk menugaskan isi
dari bidang teks kepada variabel id.
Baris 34 menggunakan getElementById
lagi untuk mencari elemen yang memiliki atribut id yang cocok dengan isi dari variabel id, dan menugaskannya kepada variabel target. Jika sebuah elemen ditemukan dengan id yang diberikan, maka getElementById
akan menghasilkan nilai balik berupa sebuah objek yang merepresentasikan elemen
tersebut. Jika tidak ada elemen cocok yang ditemukan, maka getElementById akan menghasilkan null. Baris 36 memeriksa apakah
target merupakan sebuah objek (Ingat bahwa sembarang objek yang dipakai sebagai
ekspresi boolean adalah true,
sedangkan null adalah false). Jika target dievaluasi menjadi true, maka baris 37 akan memanggil
fungsi geserKe dengan target sebagai argumennya.
Fungsi geserKe, yang didefinisikan pada baris 106-112, dipakai di seluruh
program untuk menyoroti sebuah elemen baru pada halaman. Elemen sekarang
diberikan latar-belakang kuning menggunakan kelas gaya highlighted, yang didefinisikan pada baris 22. Baris 108 menetapkan
properti className dari simpul
sekarang menjadi string kosong. Properti className
memampukan Anda untuk mengubah atribut class
dari sebuah elemen XHTML. Pada kasus ini, Anda menghapus atribut class untuk membuang kelas highlighted dari simpulSekarang sebelum Anda menyoroti elemen yang baru.
Baris 109 menugaskan objek simpulBaru (yang dilewatkan kepada
fungsi sebagai sebuah parameter) kepada variabel simpulSekarang. Baris 110 menambahkan kelas gaya highlighted pada simpulSekarang yang baru menggunakan properti className.
Terakhir, baris 111 menggunakan
properti id untuk menugaskan id dari simpul sekarang kepada properti
value dari bidang masukan. Sama
seperti className yang memampukan
Anda untuk mengakses atribut class dari
sebuah elemen, properti id juga
mengendalikan atribut id sebuah
elemen. Baris ini dipakai untuk memastikan bahwa properti value dari bidang teks konsisten dengan id dari simpul yang terseleksi saat ini.
Menciptakan dan Menyisipkan Elemen Menggunakan insertBefore
dan appendChild
Dua baris tabel selanjutnya memampukan
pengguna untuk menciptakan sebuah elemen baru dan menyisipkannya tepat sebelum
simpul sekarang atau sebagai anak dari simpul sekarang. Baris kedua (baris
141-145) memampukan pengguna untuk memasukkan teks ke dalam bidang teks dan
mengklik tombol Sisipkan sebelum. Teks ditempatkan pada sebuah paragraf baru,
yang kemudian disisipkan ke dalam dokumen tepat sebelum elemen yang terseleksi
saat ini. Tombol-tombol pada baris 143-144 memanggil fungsi sisip, yang didefinisikan pada baris
42-48.
Baris 44-45 memanggil fungsi ciptakanSimpulBaru, melewatkan
kepadanya nilai dari bidang masukan (dengan id adalah sisip) sebagai
argumen. Fungsi ciptakanSimpulBaru,
yang didefinisikan pada baris 94-103, menciptakan sebuah simpul paragraf yang
memuat teks yang dilewatkan kepada fungsi itu. Baris 96 menciptakan sebuah
elemen p menggunakan metode createElement dari objek document. Metode createElement menciptakan sebuah simpul DOM yang baru, dan
mengambil nama tag sebagai argumennya. Perhatikan bahwa ketika createElement menciptakan sebuah
elemen, ia tidak menyisipkan elemen tersebut pada halaman.
Baris 97 menciptakan sebuah id unik untuk elemen baru dengan
menyambungkan “baru” dengan nilai
dari hitungId sebelum menginkremen hitungId pada baris 98. Baris 99
menugaskan id kepada elemen baru.
Baris 100 menyambung id dari elemen
(diapit kurung siku) dengan awal dari teks
(parameter yang memuat teks paragraf).
Baris 101 mengenalkan dua metode baru.
Metode createTextNode dari objek document menciptakan sebuah simpul yang
hanya dapat memuat teks. Jika diberikan sebuah argumen string, maka createTextNode akan menyisipkan string
tersebut ke dalam simpul teks. Pada baris 101, Anda menciptakan sebuah simpul
teks baru yang memuat isi dari variabel teks.
Simpul baru ini kemudian dipakai (masih pada baris 101) sebagai argumen kepada
metode appendChild, yang dipanggil
pada simpul paragraf. Metode appendChild
dipanggil pada sebuah simpul induk untuk menyisipkan simpul anak (yang
dilewatkan sebagai argumen).
Seteleh elemen p diciptakan, baris 102
mengembalikan simpul tersebut kepada fungsi pemanggil sisip, dimanan ia
ditugaskan kepada variabel simpulBaru
pada baris 44-45. Baris 46 menyisipkan sebuah simpul yang baru saja diciptakan
tepat sebelum simpul yang sekarang terseleksi. Properti parentNode dari setiap simpul DOM memuat induk dari simpul. Pada
baris 46, Anda menggunakan properti parentNode
dari simpulSekarang untuk mendapatkan
induknya.
Anda memanggil metode insertBefore (baris 46) pada simpul
induk dengan simpulBaru dan simpulSekarang sebagai argumennya untuk
menyisipkan simpulBaru sebagai anak
dari induk secara langsung (berada sebelum simpulSekarang).
Sintaks umum dari metode insertBefore
adalah
induk.insertBefore( anakBaru,
anakYgAda );
Metode ini dipanggil pada sebuah induk
dengan anak baru dan anak yang sudah ada sebagai argumen. Simpul anakBaru disisipkan sebagai anak dari
induk secara langsung dan ditempatkan sebelum anakYgAda. Baris 47 menggunakan fungsi geserKe untuk memperbarui simpulSekarang
menjadi simpul yang baru saja disisipkan dan menyorotinya pada halaman XHTML.
Baris tabel yang ketiga (baris 145-149)
memampukan pengguna untuk menyambung atau menempelkan sebuah simpul paragraf
baru sebagai anak dari elemen sekarang. Fitur ini menggunakan prosedur yang
sama dengan fungsionalitas insertBefore.
Baris 53-54 pada fungsi appendNode
menciptakan sebuah simpul baru, baris 55 menyisipkannya sebagai anak dari
simpul sekarang, dan baris 56 menggunakan geserKe
untuk memperbarui simpulSekarang dan
menyoroti simpul yang baru.
Mengganti dan Menghapus Elemen Menggunakan replaceChild
dan removeChild
Dua baris berikutnya (baris 149-156)
memampukan pengguna untuk mengganti elemen sekarang dengan sebuah elemen p yang
baru atau hanya untuk menghapus elemen sekarang. Baris 150-152 memuat sebuah
bidang teks dan sebuah tombol yang mengganti elemen tersorot sekarang dengan
sebuah simpul paragraf baru yang memuat teks pada bidang teks.
Tombol pada baris 151-152 memanggil
fungsi gantiSekarang, yang
didefinisikan pada baris 60-66. Baris 62-63 memanggil ciptakanSimpulBaru, dengan cara yang sama dengan yang ada pada insert dan appendNode, untuk mendapatkan format teks dari bidang masukan.
Baris 64 mendapatkan induk dari simpulSekarang,
kemudian memanggil metode replaceChild
pada induk tersebut. Metode replaceChild
bekerja sebagai berikut:
induk.replaceChild(
anakBaru, anakLama );
Metode replaceChild dari induk menyisipkan anakBaru menggantikan anakLama.
Baris 77 menggunakan metode removeChild untuk menghapus simpulLama (sebuah anak dari simpulSekarang yang baru) dari
tempatnya pada dokumen XHTML. Secara umum,
induk.removeChild(
anak );
akan menghapus anak dari simpul induk.
9.4 Gaya Dinamis
Gaya (style) sebuah elemen dapat diubah
secara dinamis. Seringkali perubahan tersebut dilakukan untuk merespon event
dari pengguna. Perubahan gaya semacam itu dapat menciptakan banyak efek,
termasuk menu interaktif dan animasi. Gambar 9.3 merupakan sebuah contoh
sederhana yang mengubah properti gaya background-color
dalam merespon masukan dari pengguna.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?xml
version = "1.0" encoding = "utf-8"?>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Gambar 9.3: gayadinamis.html -->
<!--
Gaya dinamis. -->
<html xmlns =
"http://www.w3.org/1999/xhtml">
<head>
<title>Gaya Dinamis</title>
<script type = "text/javascript">
<!--
function mulai()
{
var warnaMasukan =
prompt( "Masukkan sebuah warna masukan " +
"untuk warna
latar dari halaman ini", "" );
document.body.style.backgroundColor
= warnaMasukan;
} // akhir fungsi mulai
// -->
</script>
</head>
<body id =
"body" onload = "mulai()">
<p>Selamat Datang ke
Situs Kami!</p>
</body>
</html>
|
Gambar 9.3 Gaya (style) dinamis
Fungsi mulai (baris 12-17) meminta pengguna untuk memasukkan sebuah nama
warna, kemudian menetapkan warna latar-belakang menggunakan nilai tersebut.
Perhatikan bahwa error akan terjadi bila Anda memasukkan warna yang tidak
valid. Anda merujuk warna latar-belakang sebagai document.body.style.backgroundColor, yaitu properti body dari objek document. Anda kemudian menggunakan properti style (sebuah properti dari hampir semua elemen XHTML) untuk
menetapkan properti backgroung-color
dari CSS. Dalam JavaScript, properti ini dikenal sebagai backgroundColor,
dimana tanda hubung (-) dihapus untuk menghindari kebingungan dengan operator
pengurangan. Konvensi penamaan ini konsisten dengan hampir semua properti CSS.
Sebagai contoh, borderWidth
berkorelasi dengan border-width
(properti CSS), dan fontFamily
berkorelasi dengan properti CSS font-family.
Secara umum, semua properti CSS diakses dalam format simpul.style.propertistyle.
Gambar 9.4 mengintroduksi metode setInterval dan clearInterval dari objek window,
dengan menggabungkan keduanya dengan gaya dinamis untuk menciptakan efek
animasi. Contoh ini merupakan sebuah viewer
citra sederhana yang memampukan Anda untuk memiliki sampul buku Sianipar dan
melihatnya dalam ukuran yang lebih besar. Ketika citra salah satu citra thumbnail di sisi kanan diklik, versi
citra yang lebih besar akan bertumbuh dari pojok kiri-atas pada area citra
utama.
Elemen body (baris 66-85) memuat dua elemen div, keduanya menggunakan left menggunakan gaya-gaya yang
didefinisikan pada baris 14 dan 17. Elemen div
sebelah kiri memuat citra berukuran-penuh buku1.jpg,
yang muncul ketika halaman dimuat. Elemen div
sebelah kanan memuat enam citra thumbnail
yang akan merespon event klik dengan memanggil metode tampil dan melewatkan
kepadanya nama file dari citra berukuran-penuh terkait.
Fungsi tampil (baris 46-62) secara dinamis memperbarui citra pada div sebelah kiri menjadi citra yang
diklik oleh pengguna. Baris 48-49 mencegah bagian lain dari fungsi untuk
dieksekusi jika interval
didefinisikan (animasi sedang berlangsung). Baris 51 mendapatkan div kiri dengan idnya, imgSampul. Baris
52 menciptakan sebuah elemen img
yang baru. Baris 53-55 menetapkan idnya
menjadi imgSampul, menetapkan srcnya menjadi file citra yang sesuai
di dalam direktori ukuranpenuh, dan
menetapkan atribut alt yang
diperlukan. Baris 56-59 menambahkan beberapa inisialisasi lain sebelum memulai
animasi pada baris 61. Untuk menciptakan efek animasi pertumbuhan, baris 57-58
menetapkan width dan height menjadi 0. Baris 59 mengganti
simpul citraBesar dengan simpulBaru (yang diciptakan pada baris
52), dan baris 60 menetapkan hitung,
variabel yang mengendalikan animasi, menjadi 0.
Baris 61 mengintroduksi metode setInterval dari objek window, yang memulai animasi. Metode
ini mengambil dua parameter, yaitu sebuah statemen untuk dieksekusi secara
berulang dan sebuah integer yang menetapkan berapa kali eksekusi dilakukan
(dalam milidetik). Anda menggunakan setInterval
untuk memanggil fungsi jalankan
setiap 10 detik. Metode setInterval
menghasilkan sebuah pengenal unik untuk menjejak interval tertentu. Anda
menugaskan pengenal ini kepada variabel interval.
Anda menggunakan pengenal ini untuk menghentikan animasi ketika citra telah
selesai membesar.
Fungsi jalankan, yang didefinisikan pada baris 28-42, menambah tinggi
citra dengan nilai kecepatan dan
memperbarui lebarnya untuk menjaga konsistensi aspek rasio. Karena fungsi jalankan dipanggil tiap 10 milidetik,
penambahan ini terjadi secara berulang untuk menciptakan efek pembesaran
teranimasi.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
<?xml
version = "1.0" encoding = "utf-8"?>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Gambar 9.4: viewersampul.html -->
<!--
Gaya-gaya dinamis dipakai untuk animasi. -->
<html xmlns =
"http://www.w3.org/1999/xhtml">
<head>
<title>Viewer Sampul
Buku Sianipar</title>
<style type =
"text/css">
.thumbs { width: 192px;
height: 370px;
padding: 5px;
float: left }
.mainimg { width: 289px;
padding: 5px;
float: left }
.imgSampul { height: 373px
}
img { border: 1px solid
black }
</style>
<script type =
"text/javascript">
<!--
var interval = null;
//menjejak interval
var kecepatan = 6; //
menentukan kecepatan animasi
var hitung = 0; // ukuran citra selama animasi
// dipanggil secara berulang
untuk menganimasi sampul buku
function jalankan()
{
hitung += kecepatan;
// menghentikan animasi
ketika citra cukup besar
if ( hitung >= 375
)
{
window.clearInterval(
interval );
interval = null;
} // akhir if
var citraBesar =
document.getElementById( "imgSampul" );
citraBesar.style.width =
.7656 * hitung + "px";
citraBesar.style.height =
hitung + "px";
} // akhir fungsi jalankan
// menyisipkan citra sesuai pada
area citra utama dan
// memulai animasi
function tampil(
filecitra)
{
if ( interval )
return;
var citraBesar =
document.getElementById( "imgSampul" );
var simpulBaru =
document.createElement( "img" );
simpulBaru.id = "imgSampul";
simpulBaru.src = "ukuranpenuh/"
+ filecitra;
simpulBaru.alt = "Citra
Besar";
simpulBaru.className = "imgSampul";
simpulBaru.style.width =
"0px";
simpulBaru.style.height =
"0px";
citraBesar.parentNode.replaceChild( simpulBaru, citraBesar );
hitung = 0; // memulai citra
pada ukuran 0
interval =
window.setInterval( "jalankan()", 10 ); // animasi
} // akhir fungsi tampil
// -->
</script>
</head>
<body>
<div id = "mainimg"
class = "mainimg">
<img id =
"imgSampul" src = "ukuranpenuh/buku1.jpg"
alt = "Citra Sampul
Penuh" class = "imgSampul" />
</div>
<div id = "thumbs" class
= "thumbs" >
<img src =
"thumbs/buku1.jpg" alt = "buku1"
onclick = "tampil(
'buku1.jpg' )" />
<img src =
"thumbs/buku2.jpg" alt = "buku2"
onclick = "tampil(
'buku2.jpg' )" />
<img src =
"thumbs/buku3.jpg" alt = "buku3"
onclick = "tampil(
'buku3.jpg' )" />
<img src =
"thumbs/buku4.jpg" alt = "buku4"
onclick = "tampil(
'buku4.jpg' )" />
<img src =
"thumbs/buku5.jpg" alt = "buku5"
onclick = "tampil(
'buku5.jpg' )" />
<img src =
"thumbs/buku6.jpg" alt = "buku6"
onclick = "tampil(
'buku6.jpg' )" />
</div>
</body>
</html>
|
Gambar 9.4 Gaya-gaya dinamis untuk animasi
Baris 30 menambahkan nilai dari kecepatan (dideklarasikan dan
diinisialisasi dengan 6 pada baris 24) pada hitung, yang menjejak kemajuan animasi dan menentukan ukuran
terkini dari citra. Jika citra telah membesar menjadi ukuran penuh dengan height (35), maka baris 35 akan
menggunakan metode clearInterval
dari objek window untuk menghentikan
pemanggilan repetitif atas metode jalankan.
Anda melewatkan pengenal interval kepada clearInterval pada baris 61.
Baris 39 mendapatkan citra dan baris
40-41 menetapkan properti width dan height dari CSS. Perhatikan bahwa baris
40 mengalikan hitung dengan sebuah faktor penskala .7656 untuk menjaga konsistensi rasio citra.
No comments:
Post a Comment