JAVASCRIPT
Menjalankan JavaScript
Apa yang diperlukan untuk menjalankan script yang ditulis dengan
JavaScript? Kita perlu JavaScript-enabled browser yaitu browser yang
mampu menjalankan JavaScript misalnya Netscape Navigator
(versi 2.0 ke atas ) atau Microsoft Internet Explorer (MSIE - versi 3.0
ke atas). Mengingat kedua browser di atas telah banyak beredar dan
digunakan, pemilihan JavaScript sebagai untuk meningkatkan
kemampuan halaman web menjadi sangat baik. Untuk menggunakan
JavaScript kita harus telah mengenal baik HTML.
105
<html>
<body>
<br>
Ini halaman HTML normal.
<br>
<script language="JavaScript">
document.write("Yang ini akibat JavaScript!")
</script>
<br>
Ini HTML lagi.
</body>
</html>
<script language="JavaScript">
document.write("Yang ini akibat JavaScript!")
</script>
Non-JavaScript browser
Apa yang akan terjadi jika kita menggunakan browser yang tidak
mengerti JavaScript? Non-JavaScript browser tidak mengenal tag
<script>. Dia akan mengabaikan tag itu dan mengeluarkan seluruh
kode selayaknya text biasa . Ini berarti bahwa user akan melihat kode
JavaScript program kita yang ada di dokumen HTML. Ini tentunya
bukan hal yang kita harapkan. Ada cara untuk menyembunyikan
baris kode dari browser yang seperti itu, yaitu dengan menggunakan
HTML-comments <!-- -->. Baris kode kita yang baru akan terlihat
seperti ini:
<html>
<body>
<br>
Ini dokumen HTML normal
<br>
107
<script language="JavaScript">
<!-- hide from old browsers
document.write("Yang ini akibat JavaScript!")
// -->
</script>
<br>
Ini HTML lagi.
</body>
</html>
108
Event
Event dan event handler merupakan hal yang sangat penting dalam
pemrograman JavaScript. Event adalah sesuatu yang terjadi karena
aksi user. Contohnya jika user men-click tombol mouse terjadilah
event Click. Jika mousepointer bergerak melewati sebuah link
terjadilah event MouseOver. Ada banyak event yang terdapat dalam
JavaScript yang selengkapnya bisa di lihat pada JavaScript Reference.
Tentunya kita ingin program JavaScript kita bereaksi jika terjadi
suatu event tertentu. Ini bisa dilakukan dengan bantuan eventhandlers. Sebagai contoh kita memiliki sebuah tombol yang akan
mengeluarkan sebuah popup window jika di-tekan. Ini berarti bahwa
sebuah window popup harus muncul sebagai reaksi dari event Click.
Event-handler yang harus kita gunakan adalah onClick, yang
memberitahukan apa yang harus dikerjakan oleh komputer jika event
ini terjadi. Contoh di bawah ini menunjukkan bagaimana mudahnya
menggunakan event-handler onClick:
<form>
<input type="button" value="Click me"
onClick="alert('Ya')">
</form>
Ada beberapa hal baru dalam kode di atas, mari kita lihat satu per
satu. Kita telah membuat form dan sebuah tombol (ini merupakan
bahasa
HTML
standard).
Bagian
yang
baru
adalah
onClick="alert('Ya')" yang berada di dalam tag <input>. Inilah
yang mendefinisikan apa yang akan terjadi jika tombol ditekan. Jadi
jika terjadi event Click, komputer akan mengeksekusi alert('Ya'),
yang merupakan kode JavaScript (perhatikan bahwa kita tidak
menggunakan tag <script> pada kasus ini).
Fungsi alert() berfungsi untuk menampilkan window popup. Di
dalam tanda kurung kita tentukan string yang akan muncul pada
109
hal
yang
Function
Pada dasarnya function merupakan cara untuk menyatukan
beberapa perintah. Mari kita tulis sebuah script yang mengeluarkan
teks tertentu sebanyak tiga kali. Perhatikan contoh berikut ini:
<html>
<script language="JavaScript">
<!-- hide
// -->
</script>
</html>
<html>
<script language="JavaScript">
<!-- hide
function myFunction() {
document.write("Selamat datang pada homepage
saya!<br>");
document.write("Ini menggunakan JavaScript!<br>");
}
myFunction();
myFunction();
myFunction();
// -->
</script>
</html>
111
function myFunction() {
document.write("Selamat datang pada homepage
saya!<br>");
document.write("Ini menggunakan JavaScript!<br>");
}
<html>
<head>
<script language="JavaScript">
<!-- hide
function calculation() {
var x = 12;
var y = 5;
var result = x + y;
alert(result);
}
// -->
</script>
112
</head>
<body>
<form>
<input type="button" value="Calculate"
onClick="calculation()">
</form>
</body>
</html>
tersebut. Untuk ini kita harus mengerti hirarki dari semua objectobject HTML.
Sebagai contoh kode berikut ini merupakan halaman HTML
sederhana berikut ini.
<html>
<head>
</head>
<body bgcolor=#ffffff>
<center>
<img src="home.gif" name="pic1" width=200
height=100>
</center>
<p>
<form name="myForm">
Name:
<input type="text" name="name" value=""><br>
e-Mail:
<input type="text" name="email" value=""><br><br>
<input type="button" value="Push me"
name="myButton" onClick="alert('Yo')">
</form>
<p>
<center>
<img src="ruler.gif" name="pic4" width=300
height=15>
<p>
<a href="http://www.hermantolle.org/index.html">My
homepage</a>
</center>
</body>
</html>
114
Kita lihat ada dua image, satu link dan sebuah form dengan dua text
field dan sebuah tombol. Dari pandangan JavaScript window browser
adalah sebuah window-object. Window-object ini berisi elemenelemen seperti statusbar. Di dalam window kita dapat me-load
dokumen HTML (atau file bertipe lain - kita batasi dulu pada file
HTML). Halaman ini merupakan sebuah document-object. Artinya
document-object mewakili dokumen HTML yang di-load pada saat
itu. Document-object merupakan object yang sangat penting dalam
JavaScript kita akan sering menggunakannya. Properti dari
document-object contohnya adalah warna background halaman.
115
Berikut ini ilustrasi hirarki yang dibuat oleh contoh halaman HTML
di atas:
kecil artinya kita tidak bisa menulis myform untuk myForm). Properti
object-object JavaScript tidak cuma dibatasi pada operasi pembacaan
saja. Kita dapat juga mengisi harga baru untuk properti tertentu.
Contohnya kita dapat menulis string baru ke text field sebagai berikut.
<form name="myForm">
<input type="text" name="input" value="bla bla
bla">
<input type="button" value="Write"
onClick="document.myForm.input.value= 'Ya ya ya!';
">
<html>
<head>
<title>Objects</title>
<script language="JavaScript">
<!-- hide
function first() {
118
function second() {
// output string
alert(myString);
}
// -->
</script>
</head>
<body bgcolor=lightblue>
<form name="myForm">
<input type="text" name="myText" value="bla bla
bla">
<input type="button" name="button1" value="Button
1"
onClick="first()">
<br>
<input type="checkbox" name="myCheckbox" CHECKED>
<input type="button" name="button2" value="Button
2"
onClick="second()">
</form>
119
<p><br><br>
<script language="JavaScript">
<!-- hide
// -->
</script>
</body>
</html>
6.3 WINDOW
Membuat window
Kemampuan membuka window browser baru merupakan salah satu
keunggulan JavaScript. Kita bisa me-load dokumen (misalnya
dokumen HTML) ke window yang baru itu atau bahkan membuat
dokumen baru (on-the-fly). Pertama mari kita lihat bagaimana cara
membuka window baru, me-load halaman HTML kedalam window
ini dan kemudian menutupnya. Script berikut ini membuka browser
window baru dan me-load sebuah halaman page:
120
<html>
<head>
<script language="JavaScript">
<!-- hide
function openWin() {
myWin= open("bla.htm");
}
// -->
</script>
</head>
<body>
<form>
<input type="button" value="Open new window"
onClick="openWin()">
</form>
</body>
</html>
<html>
<head>
121
<script language="JavaScript">
<!-- hide
function openWin2() {
myWin= open("bla.htm", "displayWindow",
"width=400, height=300, status=no, toolbar=no,
menubar=no");
}
// -->
</script>
</head>
<body>
<form>
<input type="button" value="Open new window"
onClick="openWin2()">
</form>
</body>
</html>
122
Terlihat
bahwa
kita
menentukan
properti-nya
"width=400,height=300,status=no,toolbar=no,menubar=no".
dengan
Kita
yes|no
Height
number of pixels
Location
yes|no
Menubar
yes|no
Resizable
yes|no
Scrollbars
yes|no
Status
yes|no
Toolbar
yes|no
Width
number of pixels
alwaysLowered
yes|no
AlwaysRaised
yes|no
dependent
yes|no
hotkeys
yes|no
innerWidth
innerHeight
outerWidth
number of pixels
outerHeight
number of pixels
screenX
position in pixels
screenY
position in pixels
titlebar
yes|no
z-lock
yes|no
Nama window
Kita menggunakan tiga argumen untuk membuka sebuah window:
myWin = open("bla.htm", "displayWindow",
"width=400,height=300,status=no,toolbar=no,menubar=
no");
Apa guna dari argumen kedua? Ini adalah nama window. Jika kita
tahu nama dari window kita bisa me-load halaman baru kedalamnya
dengan:
<a href="bla.html" target="displayWindow">
Di sini kita perlu nama window (jika windownya tidak ada, window
baru akan dibuat secara otomatis). Perhatikan bahwa myWin bukan
nama window walaupun kita bisa mengakses window melalui
variabel ini. Variabel ini merupakan variabel lokal yang hanya
berlaku di dalam script tempat ia di-definisikan. Nama window yang
global (displayWindow) merupakan nama yang unik yang dapat
digunakan oleh seluruh window browser yang sedang terbuka.
124
Menutup window
Kita dapat menutup suatu window melalui JavaScript dengan
method close(). Mari kita buka window baru seperti sebelumnya.
Pada window ini kita me-load halaman berikut:
<html>
<script language="JavaScript">
<!-- hide
function closeIt() {
close();
}
// -->
</script>
<center>
<form>
<input type=button value="Close it"
onClick="closeIt()">
</form>
</center>
</html>
Jika kita menekan tombol "Close it" pada window yang baru itu,
window-nya akan tertutup. Method open() dan close() merupakan
method dari window-object. Seharusnya kita menuliskannya sebagai
window.open() dan window.close() dan bukan open() dan close()
saja. Tetapi ini dibolehkan karena pada window-object kita tidak
125
harus menulis window jika kita ingin memanggil method yang ada
padanya (khusus untuk window-object).
<html>
<head>
<script language="JavaScript">
<!-- hide
function statbar(txt) {
window.status = txt;
}
// -->
</script>
</head>
<body>
<form>
<input type="button" name="look" value="Write!"
onClick="statbar('Hi! This is the
statusbar!');">
126
</body>
</html>
Pada contoh di atas, kita membuat sebuah form dengan dua buah
tombol. Kedua tombol itu memanggil function statbar(). Lihat
bahwa pemanggilan function yang dilakukan oleh tombol Write!
adalah seperti berikut:
statbar('Hi! This is the statusbar!');
127
<a href="dontclck.htm"
onMouseOver="window.status='Don\'t click me!';
return true;"
onMouseOut="window.status='';">link</a>
Timeout
Dengan timeout (atau timer) kita bisa memerintahkan komputer
menjalankan kode setelah sekian waktu tertentu. Sebagain contoh,
pada kode berikut ini jika tombol ditekan maka setelah 3 detik akan
muncul window pop-up:
<script language="JavaScript">
<!-- hide
function timer() {
setTimeout("alert('Time is up!')", 3000);
}
// -->
</script>
...
<form>
<input type="button" value="Timer"
onClick="timer()">
</form>
Scroller
Dengan mengetahui bagaimana menulis ke statusbar dan bagaimana
timeout bekerja sekarang kita coba membuat scrollers. Scroller
merupakan text yang bergerak pada statusbar. Kita akan coba
membuat program scroller dasar. Kita bisa mengembangkannya lebih
lanjut jika diperlukan.
Scrollers sebenarnya tidak terlalu sulit diimplementasikan, karena
sebenarnya hanya menulisi text pada statusbar. Setelah sekian waktu
yang tertentu kita tulisi lagi text yang sama tapi pada posisi yang
sedikit lebih ke kiri. Lalu kita ulangi proses ini terus menerus
sehingga kita mendapatkan efek seakan-akan text bergerak dari
kanan ke kiri.
Yang harus dipikirkan adalah menentukan bagian mana dari text
yang harus ditampilkan karena keseluruhan text biasanya lebih
panjang daripada statusbar.
Ketikkan contoh berikut ini
<html>
<head>
<script language="JavaScript">
<!-- hide
function scroll() {
130
pos++;
if (pos < 0) {
for (var i = 1; i <= Math.abs(pos); i++) {
scroller = scroller + " ";}
scroller = scroller + scrtxt.substring(0, width
- i + 1);
}
else {
scroller = scroller + scrtxt.substring(pos,
width + pos);
}
131
// -->
</script>
</head>
<body onLoad="scroll()">
Your HTML-page goes here.
</body>
</html>
Kode ini akan membuat sebuah Date-object baru bernama today. Jika
kita tidak menentukan hari dan waktu tertentu sebagai argumennya
berarti tanggal dan waktu sekarang yang akan digunakan. Artinya
setelah mengeksekusi today= new Date(), today akan mewakili
tanggal dan waktu sekarang.
Date-object menyediakan method yang bisa kita gunakan melalui
object today. Method-mothod ini contohnya adalah getHours(),
setHours(), getMinutes(), setMinutes(), getMonth(), setMonth()
133
// -->
</script>
<html>
<head>
<script Language="JavaScript">
<!-- hide
var timeStr, dateStr;
function clock() {
now= new Date();
// time
hours= now.getHours();
minutes= now.getMinutes();
seconds= now.getSeconds();
timeStr= "" + hours;
timeStr+=((minutes < 10) ? ":0" : ":")+ minutes;
timeStr+=((seconds < 10) ? ":0" : ":")+ seconds;
document.clock.time.value = timeStr;
// date
135
date= now.getDate();
month= now.getMonth()+1;
year= now.getYear();
dateStr= "" + month;
dateStr+= ((date < 10) ? "/0" : "/") + date;
dateStr+= "/" + year;
document.clock.date.value = dateStr;
Timer= setTimeout("clock()",1000);
}
// -->
</script>
</head>
<body onLoad="clock()">
<form name="clock">
Time: <input type="text" name="time" size="8"
value=""><br>
Date: <input type="text" name="date" size="8"
value="">
</form>
</body>
</html>
Array-object
Array merupakan suatu hal yang sangat penting diketahui. Misalkan
kita ingin menyimpan 100 nama yang berbeda. Bagaimana
melakukannya dengan JavaScript? Kita bisa saja mendefinisikan 100
variabel dan mengisinya dengan sederetan nama-nama. Cara ini
cukup rumit dan tidak efisien.
Array bisa dilihat sebagai banyak variabel yang disatukan. Kita bisa
mengaksesnya melalui satu nama dan penomoran. Misalnya array
kita berinama names. Maka kita dapat mengakses nama pertama
melalui names[0], nama kedua dengan names[1] dan seterusnya.
Setelah JavaScript 1.1 (Netscape Navigator 3.0) kita bisa
menggunakan Array-object. Kita membuat array baru dengan
perintah myArray = new Array(). Kita kemudian bisa mengisi
harganya dengan:
137
myArray[0]= 17;
myArray[1]= "Stefan";
myArray[2]= "Koch";
Mari kita beranjak melihat contoh dibawah ini. Keluaran dari yang
diinginkan adalah seperti:
first element
second element
third element
<script language="JavaScript">
<!-- hide
document.write(myArray[i] + "<br>");
}
// -->
</script>
Pada kode di atas, pertama kali kita buat array dengan nama myArray.
Lalu kita isi dengan tiga harga yang berbeda. Setelah itu kita mulai
sebuah
loop.
Loop
ini
menjalankan
perintah
document.write(myArray[i]+"<br>"); sebanyak tiga kali. Variabel i
menghitung dari 0 sampai 2 dengan for-loop. Kita lihat kita
menggunakan myArray[i] di dalam for-loop. Karena i menghitung
dari 0 sampai 2 kita memperoleh tiga kali pemanggilan
document.write(). Kita bisa menulis loop di atas seperti ini:
document.write(myArray[0] + "<br>");
document.write(myArray[1] + "<br>");
document.write(myArray[2] + "<br>");
function initArray() {
this.length = initArray.arguments.length
for (var i = 0; i < this.length; i++)
this[i+1] = initArray.arguments[i]
}
139
Tentunya array ini tidak akan memiliki method yang ada pada
Array-object JavaScript 1.1.
6.6 FORM
Validasi input form
Form banyak sekali digunakan di Internet maupun intranet.
Masukan form biasanya dikirimkan lagi ke server atau via mail ke email account tertentu. Bagaimana kita bisa memastikan bahwa data
yang dimasukkan user valid atau tidak? Dengan bantuan JavaScript
form input dapat dengan mudah di-cek sebelum dikirimkan lewat
Internet. Pertama mari kita lihat contoh bagaimana input dari user divalidasi, lalu kita lihat bagaimana mengirimkan informasi melalui
Internet.
Mari kita buat script sederhana yang berupa halaman HTML yang
berisi dua text-element. User harus memasukkan namanya pada textelement pertama dan e-mail address-nya pada elemen kedua. Sebagai
contoh masukkan sembarang text pada input yang disediakan. Jika
input tidak valid maka akan muncul window peringatan yang
mengatakan bahwa input tidak valid. Berikut ini kira-kira tampilan
contoh yang akan kita buat.
140
Pada text-element kedua, jika kita masukkan text yang tidak sesuai
dengan format e-mail (ada tanda @) maka text dianggap tidak valid:
141
Jika kita memasukkan input yang benar maka pesan valid akan
muncul
<html>
<head>
<script language="JavaScript">
<!-- Hide
function test1(form) {
if (form.text1.value == "")
alert("Please enter a string!")
else {
alert("Hi "+form.text1.value+"! Form input
ok!");
}
142
function test2(form) {
if (form.text2.value == "" ||
form.text2.value.indexOf('@', 0) == -1)
alert("No valid e-mail address!");
else alert("OK!");
}
// -->
</script>
</head>
<body>
<form name="first">
Enter your name:<br>
<input type="text" name="text1">
<input type="button" name="button1" value="Test
Input" onClick="test1(this.form)">
<P>
Enter your e-mail address:<br>
<input type="text" name="text2">
<input type="button" name="button2" value="Test
Input" onClick="test2(this.form)">
</body>
</html>
Jika kita masukkan angka-angka dan simbol-simbol "/", "-", dan " ",
maka ketika kita tekan tombol check, akan keluar pesan OK.
Namun jika kita masukkan sembarang karakter di samping karakterkarakter di atas, maka akan keluar pesan error:
function check(input) {
var ok = true;
145
function test(input) {
if (!check(input, "1", "2", "3", "4",
"5", "6", "7", "8", "9", "0", "/", "-", "
")) {
alert("Input not ok.");
}
else {
alert("Input ok!");
}
}
// -->
</script>
</head>
<body>
<form>
Telephone:
<input type="text" name="telephone" value="">
146
<form method=post
action="mailto:your.address@goes.here"
enctype="text/plain">
Do you like this page?
<input name="choice" type="radio" value="1">Not
at all.<br>
<input name="choice" type="radio" value="2"
CHECKED>Waste of time.<br>
<input name="choice" type="radio" value="3">Worst
site of the Net.<br>
<input name="submit" type="submit" value="Send">
</form>
function validate() {
// check if input ok
// ...
148
...
Dengan kode itu, form tidak akan terkirim lewat Internet jika form
input masih salah.
6.8 Image-object
Image pada halaman web
Sekarang kita akan melihat Image-object yang tersedia dalam
JavaScript 1.1 (Netscape Navigator 3.0 ke atas). Dengan banutan
Image-object kita bisa mengganti gambar pada image pada suatu
halaman web, sehingga memungkinkan kita mambuat animasi,
misalnya.
Pertama mari kita lihat bagaimana image dalam halaman web dapat
diakses melalui JavaScript. Semua image diwakili melalui array.
Array ini disebut images yang merupakan properti dari documentobject. Setiap image dalam halaman web memiliki nomor. Image
pertama bernomor 0, image kedua bernomor 1 dan seterusnya. Jadi
kita bisa mengakses image pertama melalui document.images[0].
Setiap image dalam dokumen HTML dianggap sebagai sebuah
Image-object. Image-object tentunya memiliki properti yang dapat
diakses melalui JavaScript. Kita misalnya bisa berapa ukuran yang
dimiliki image dengan properti width dan height. Jadi
document.images[0].width akan memberi kita lebar (dalam pixel)
image pertama dalam halaman web yang kita miliki.
Jika kita memiliki banyak image dalam satu halaman akan sulit
untuk menomori seluruh image yang ada. Dengan memberikan
nama untuk setiap image akan jauh mempermudah hal ini. Jika kita
menyatakan image dengan tag berikut
<img src="img.gif" name="myImage" width=100
height=100>
150
Me-loading image
Berikut ini kita akan mencoba mengganti isi (file gambar) sebuah
image pada web-page. Untuk ini kita akan menggunakan properti
src. Properti src mewakili alamat dari file gambar yang ditampilkan.
Dengan JavaScript 1.1 kita bisa mengisi alamat file gambar yang baru
ke image yang telah di-load pada web-page. Hasilnya adalah gambar
pada lokasi yang baru akan di-load. Gambar baru ini akan
menggantikan gambar lama. Mari kita lihat contoh berikut ini:
document.myImage.src= "img2.src";
Gambar yang baru akan berukutan sama dengan gambar lama. Kita
tidak bisa merubah ukuran tempat gambar ditampilkan.
Preload image
Salah satu kelemahan dari penggantian gambar seperti di atas adalah
bahwa gambar akan di-load setelah kita mengisikan alamat baru
pada properti src. Karena gambar itu tidak di-load terlebih dahulu,
maka akan membutuhkan waktu yang lumayan lama untuk
menampilkan gambar yang baru karena harus diambil dahulu
melalui Internet. Apa yang dapat kita perbuat untuk memperbaiki
hal ini? Solusinya adalah preloading image yaitu me-load gambar
151
document.myImage.src= hiddenImg.src;
<a href="#"
onMouseOver="document.myImage2.src='img2.gif'"
onMouseOut="document.myImage2.src='img1.gif'">
<img src="img1.gif" name="myImage2" width=160
height=50 border=0></a>
(onMouseOut="document.myImage2.src='img1.gif'").
<html>
<head>
<script language="JavaScript">
<!-- hide
// -->
</script>
<script language="JavaScript1.1">
<!-- hide
// -->
</script>
<script language="JavaScript">
154
<!-- hide
if (browserOK) {
pics[objCount] = new Array(3);
pics[objCount][0] = new Image();
pics[objCount][0].src = first;
pics[objCount][1] = new Image();
pics[objCount][1].src = second;
pics[objCount][2] = name;
objCount++;
}
}
function on(name){
if (browserOK) {
for (i = 0; i < objCount; i++) {
if (document.images[pics[i][2]] != null)
if (name != pics[i][2]) {
// set back all other pictures
document.images[pics[i][2]].src =
pics[i][0].src;
} else {
// show the second image because cursor
moves across this image
155
document.images[pics[i][2]].src =
pics[i][1].src;
}
}
}
}
function off(){
if (browserOK) {
for (i = 0; i < objCount; i++) {
// set back all pictures
if (document.images[pics[i][2]] != null)
document.images[pics[i][2]].src =
pics[i][0].src;
}
}
}
// -->
</script>
156
<head>
<body>
<a href="link1.htm" onMouseOver="on('link1')"
onMouseOut="off()">
<img name="link1" src="link1f.gif"
width="140" height="50" border="0"></a>
Jika kita lihat pada bagian <body> pada contoh, kita lihat ada image
dengan nama img1. Kita gunakan nama dari image (bukan
nomornya) untuk bisa mengubah urutan gambar tanpa merubah
script-nya.
158
DAFTAR PUSTAKA
Anonymous, Javascrip Tutorial, http://www.javascriptsource.com,
diakses Januari 2006.
Anonymous, Pioneers On The Net, http://www.chick.net/wizards/
pioneers.html, diakses Januari 2006.
Budd, Andy. CSS Mastery: Advanced Web Standards Solutions,
Februari 2006.
Dave Taylor, Creating Cool Web Sites with HTML, XHTML, and CSS,
Wiley Publishing, Inc, 2004
Martin, Dodge, An Atlas of Cyberspaces- Historical Maps, http://
www.cybergeography.org/atlas/historical.html, diakses Januari
2006.
Shengili-Roberts, Keith.,Core Cascading Style Sheet, Prentice Hall,
New Jersey, 2000.
Tolle, Herman. Diktat Kuliah Internet & Disain Web. Teknik Elektro
Universitas Brawijaya. 2004.
Wibowo, Sugeng, Modul Pelatihan Dasar Disain Web. UPT Pusat
komputer universitas brawijaya, 2003.
159