Sunday, December 25, 2016

Bab 10. Pemrograman Internet



DHTML: Event







10.1 Pengantar

Anda telah melihat bahwa halaman web dapat dikendalikan lewat skrip, dan Anda juga telah melihat bahwa event dapat memicu skrip, seperti event onclick dan onsubmit. Bab ini akan membahas lebih detil mengenai event pada JavaScript, yang memampukan skrip dalam merespon interaksi pengguna dan memodifikasi halaman sesuai yang diinginkan. Event memampukan skrip untuk merespon pengguna yang menggerakkan mouse, yang memasukkan data formulir, atau yang menekan kunci. Event dan penanganan event membuat aplikasi web lebih responsif, dinamis, dan interaktif.

Pada bab ini, akan didiskusikan bagaiman membangun fungsi untuk bereaksi ketika sebua event terjadi. Akan diberikan beberapa contoh penanganan event untuk sembilan event yang umum dijumpai, termasuk event mouse dan event pemrosesan-formulir.


10.2 Mendaftarkan Event Handler
Fungsi yang menangani event disebut dengan fungsi penanganan-event atau event handler. Penugasan suatu fungsi penanganan-event kepada suatu event pada sebuah simpul DOM dinamakan dengan pendaftaran suatu fungsi penanganan-event. Sebelumnya, Anda telah mendaftarkan fungsi penanganan-event menggunakan model inline, yang memandang event sebagai atribut dari elemen XHTML (misalnya, <p onclick = “fungsiKu()”>). Model lain, yang dikenal sebagai model tradisional, untuk mendaftarkan fungsi penanganan-event didemonstrasikan pada Gambar 10.1 bersama dengan model inline.

Pada versi awal penjelajah web, model inline merupakan satu-satunya cara untuk menangani event. Selanjutnya, Netscape mengembangkan model tradisional dan Internet Explorer mengadopsinya. Sejak itu, baik Netscape maupun Microsoft mengembangkan model-model event mutakhir secara terpisah (tidak kompatibel satu sama lain) dengan fungsionalitas yang lebih baik daripada model inline atau model tradisional. Model yang dikembangkan oleh Netscape diadaptasi oleh W3C untuk menciptakan spesifikasi event DOM. Hampir semua penjelajah web mendukung model W3C, tetapi Internet Explorer tidak melakukannya.

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
<?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 10.1: pendaftaran.html -->
<!-- Model Registrasi Event. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Model-Model Registrasi Event</title>
        <style type = "text/css">
            div { padding: 5px;
                  margin: 10px;
                  border: 3px solid #0000BB;
                  width: 12em }
        </style>
        <script type = "text/javascript">
            <!--
            // Menangani event onclick tanpa memedulikan bagaimana ia didaftarkan
            function tanganiEvent()
            {
                alert( "Event berhasil ditangani." );
            } // akhir fungsi tanganiEvent

            // mendaftarkan handler menggunakan model tradisional
            function daftarkanHandler()
            {
                var tradisional = document.getElementById( "tradisional" );
                tradisional.onclick = tanganiEvent;
            } // akhir fungsi daftarkanHandler
            // -->
        </script>
    </head>
    <body onload = "daftarkanHandler()">
        <!-- Event handler didaftarkan dengan model inline -->
        <div id = "inline" onclick = "tanganiEvent()">
            Model registrasi inline</div>

        <!-- Event handler didaftarkan oleh fungsi daftarkanHandler -->
        <div id = "tradisional">Model registrasi tradisional</div>
    </body>
</html>





Gambar 10.1 Model registrasi event


Ini berarti bahwa untuk menciptakan situs web lintas-penjelajah, Anda hanya dapat menggunakan mode inline dan model tradisional.

Baris 35 menugaskan “tanganiEvent()” pada atribut onclick dari div pada baris 35-36. Ini merupakan model inline untuk registrasi event yang telah Anda lihat pada contoh-contoh sebelumnya. Elemen div pada baris 39 ditugasi sebuah fungsi penanganan-event menggunakan model tradisional. Ketika elemen body (baris 33-40) dijalankan, fungsi daftarkanHandler dipanggil.


Fungsi daftarkanHandler (baris 25-29) menggunakan JavaScript untuk mendaftarkan fungsi tanganiEvent sebagai fungsi penanganan-event untuk event onclick dari div dengan idtradisional”. Baris 27 mendapatkan div, dan baris 28 menugaskan fungsi tanganiEvent kepada properti onclick dari div.

Perhatikan bahwa pada baris 28, Anda tidak mengapit tanganiEvent atau mencantumkan sepasang kurung di akhir nama fungsi, seperti yang Anda lakukan dengan model inline pada baris 35. Pada model inline, nilai dari atribut XHTML merupakan sebuah statemen JavaScript yang akan dieksekusi ketika event terjadi. Nilai dari properti onclick dari sebuah simpul DOM bukanlah sebuah statemen yang dapat dieksekusi, tetapi nama sebuah fungsi yang akan dipanggil ketika event terjadi. Ingat bahwa fungsi pada JavaScript diperlakukan sebagai data (dilewatkan kepada metode, ditugaskan kepada variabel, dan lainnya).

Begitu fungsi penanganan-event didaftarkan pada baris 28, elemen div pada baris 39 memiliki watak yang sama dengan div pada baris 35-36, karena tanganiEvent (baris 19-20) ditetapkan untuk menangani event onclick untuk kedua div. Ketika salah satu div diklik, sebuah dialog alert akan menampilkan “Event berhasil ditangani”.

Model tradisional memampukan Anda untuk mendaftarkan fungsi penanganan-event pada kode JavaScript. Ini merupakan implikasi penting pada apa yang dapat Anda lakukan pada event JavaScript. Sebagai contoh, registrasi fungsi penanganan-event tradisional memampukan Anda untuk menugaskan fungsi penanganan-event kepada banyak elemen secara cepat. Hal ini juga memampukan Anda untuk dengan mudah menggunakan statemen repetisi.


10.3 Event onload
Event onload terpicu atau terjadi kapan saja sebuah elemen selesai berhasil dimuat (yaitu, semua anaknya dimuat). Seringkali, event ini dipakai di dalam elemen body untuk menginisiasi sebuah skrip ketika halaman dimuat pada penjelajah klien. Gambar 10.2 menggunakan event onload untuk tujuan ini. Skrip yang dipanggil oleh event onload memperbarui sebuah pewaktu untuk mengindikasikan berapa detik sejak dokumen dimuat.

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
<?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 10.2: onload.html -->
<!-- Mendemonstrasikan event onload. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Event onload</title>
        <script type = "text/javascript">
            <!--
            var detik = 0;

            // dipanggil ketika halaman dimuat untuk memulai pewaktu
            function mulaiPewaktu()
            {
                // 1000 milidetik = 1 setik
                window.setInterval( "perbaruiWaktu()", 1000 );
            } // akhir fungsi mulaiPewaktu

            // dipanggil setiap 1000 milidetik untuk memperbarui pewaktu
            function perbaruiWaktu()
            {
                ++detik;
                document.getElementById( "sejauhIni" ).innerHTML = detik;
            } // akhir fungsi perbaruiWaktu
            // -->
        </script>
    </head>
    <body onload = "mulaiPewaktu()">
        <p>Banyak detik yang Anda lewati dalam melihat halaman sejauh ini:
        <strong id = "sejauhIni">0</strong></p>
    </body>
</html>



Gambar 10.2 Mendemonstrasikan event onload


Penggunaan event onload terjadi pada baris 30. Setelah elemen body dimuat, penjelajah web akan memicu event onload. Ini akan memanggil fungsi mulaiPewaktu (baris 15-19), yang akan menggunakan metode window.setInterval untuk menetapkan bahwa fungsi perbaruiWaktu (baris 22-26) harus dipanggil setiap 1000 milidetik. Fungsi perbaruiWaktu menginkremen variabel detik dan memperbarui kounter pada halaman.

Perhatikan bahwa Anda tidak bisa menciptakan program ini tanpa event onload, karena elemen-elemen pada halaman XHTML tidak dapat diakses sampai halaman dimuat. Jika sebuah skrip di dalam head mencoba dalam memperoleh simpul DOM untuk suatu elemen XHTML di dalam body, maka getElementById akan menghasilkan null karena body belum dimuat.


10.4 Event onmousemove, Objek event, dan this
Bagian ini akan mengenalkan event onmouseevent, yang memicu secara berulang kapanpun pengguna menggerakkan mouse pada halaman web. Objek event dan katakunci this juga akan didiskusikan, yang akan meningkatkan kapabilitas penanganan-event. Gambar 10.3 menggunakan onmousemove dan this untuk menciptakan sebuah program penggambar sederhana yang memampukan pengguna untuk menggambar.

Elemen body memiliki sebuah table dengan tbody yang memuat satu baris sehingga dapat memberitahu pengguna tentang penggunaan program. Atribut onload (baris 61) memanggil fungsi ciptakanKanvas, yang menginisialisasi program dengan mengisi tabel.

Fungsi ciptakanKanvas (baris 23-41) mengisi tabel dengan sebuah grid yang memuat sel-sel. Aturan CSS pada baris 14-15 menetapkan width dan height dari tiap elemen td menjadi 4px. Baris 11 menetapkan bahwa tabel berlebar 400px. Baris 13 menggunakan properti CSS border-collapse untuk mengeliminasi spasi di antara sel-sel tabel.

Baris 25 mendefinisikan variabel sisi, yang menentukan jumlah sel pada tiap baris dan jumlah baris yang diciptakan menggunakan beberapa statemen for bersarang pada baris 28-40. Anda menetapkan sisi menjadi 100 untuk mengisi tabel dengan 10000 sel berukuran 4px. Baris 26 menyimpan elemen tbody sehingga Anda dapat menempelkan baris-baris pada elemen tersebut.

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
<?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 10.3: menggambar.html -->
<!-- Sebuah program penggambar sederhana. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Program Penggambar Sederhana</title>
        <style type = "text/css">
            #kanvas { width: 400px;
                      border: 1px solid #999999;
                      border-collapse: collapse }
            td { width: 4px;
                 height: 4px }
            th.kunci { font-family: arial, helvetica, sans-serif;
                     font-size: 12px;
                     border-bottom: 1px solid #999999 }
        </style>
        <script type = "text/javascript">
            <!--
            //fungsi inisialisasi untuk menyisipkan sel-sel ke dalam tabel
            function ciptakanKanvas ()
            {
                var sisi = 100;
                var tbody = document.getElementById( "tubuhtabel" );

                for ( var i = 0; i < sisi; i++ )
                {
                    var baris = document.createElement( "tr" );

                    for ( var j = 0; j < sisi; j++ )
                    {
                        var sel = document.createElement( "td" );
                        sel.onmousemove = prosesGerakanMouse;
                        baris.appendChild( sel );
                    } // akhir for

                    tbody.appendChild( baris );
                } // akhir for
            } // akhir fungsi ciptakanKanvas

            // memproses event onmousemove
            function prosesGerakanMouse( e )
            {
                // mendapatkan objek event dari IE
                if ( !e )
                    var e = window.event;

                // mengubah warna sel menjadi biru jika kunci Ctrl ditekan
                if ( e.ctrlKey )
                    this.style.backgroundColor = "blue";

                // mengubah warna sel menjadi biru jika kunci Shift ditekan
                if ( e.shiftKey )
                    this.style.backgroundColor = "red";
            } // akhir fungsi prosesGerakanMouse
            // -->
        </script>
    </head>
    <body onload = "ciptakanKanvas()">
        <table id = "kanvas" class = "kanvas"><tbody id = "tubuhtabel">
        <tr><th class = "kunci" colspan = "100">Tekan <tt>ctrl</tt>
            untuk menggambar biru. Tekan <tt>shift</tt> untuk menggambar merah.</th></tr>
        </tbody></table>
    </body>
</html>



Gambar 10.3 Program penggambar sederhana


Beberapa statemen for bersarang pada baris 28-40 mengisi tabel dengan sebuah grid 100  100. Loop sebelah luar menciptakan setiap baris tabel, sedangkan loop sebelah dalam menciptakan setiap sel.  Loop sebelah dalam menggunakan metode createElement untuk menciptakan sebuah sel tabel, menugaskan fungsi prosesGerakanMouse sebagai fungsi penanganan-event untuk event onmousemove pada sel, dan menempelkan sel sebagai anak dari baris. Event onmousemove dari sebuah elemen terpicu atau terjadi kapanpun pengguna menggerakkan mouse pada elemen tersebut.

Pada titik ini, program diinisialisasi dan memanggil prosesGerakanMouse ketika mouse bergerak di atas sembarang sel tabel. Fungsi prosesGerakanMouse (baris 44-57) mewarnai sel, dengan warna yang bergantung pada kunci yang ditekan ketika event terjadi. Baris 44-48 mendapatkan objek event, yang menyimpan informasi tentang event yang memanggil fungsi penanganan-event.

Internet Explorer dan Firefox tidak mengimplementasikan model event yang sama, jadi Anda perlu mengatasi perbedaan dalam bagaimana objek event ditangani dan digunakan. Firefox dan penjelajah lain (yang tunduk pada W3C), seperti Safari dan Opera, melewatkan objek event sebagai sebuah argumen kepada fungsi penanganan-event. Internet Explorer, di sisi lain, menyimpan objek event di dalam properti event dari objek window. Untuk mendapatkan objek event (tanpa memerhatikan jenis penjelajah yang digunakan), Anda memerlukan sebuah proses dua-langkah. Fungsi prosesGerakanMouse mengambil parameter e pada baris 44 untuk mendapatkan objek event dari Firefox. Kemudian, jika e tidak terdefinisi (misalnya, jika klien adalah Internet Explorer), maka Anda menugaskan objek di dalam window.event kepada e pada baris 48.

Selain menyediakan cara berbeda dalam mengakses objek event, Firefox dan Internet Explorer juga mengimplementasikan fungsionalitas yang berbeda di dalam objek event itu sendiri.

Setelah e memuat objek event, Anda dapat menggunakannya untuk memperoleh informasi seputar event yang terjadi. Baris 51-56 melakukan penggambaran aktual. Properti ctrlKey dari objek event memuat sebuah nilai boolean yang merefleksikan apakah kunci Ctrl ditekan selama berlangsungnya event. Jika ctrlKey bernilai true, maka baris 52 akan dieksekusi dan mengubah warna dari sebuah sel tabel.

Untuk menentukan sel tabel mana yang akan diwarnai, Anda menggunakan katakunci this. Makna dari this bergantung konteks. Pada suatu fungsi penanganan-event, this merujuk ke objek DOM dimana event terjadi. Skrip menggunakan this untuk merujuk ke sel tabel dimana mouse digerakkan.

Baris 51-52 mengubah warna latar-belakang dari sel tabel this menjadi biru jika kunci Ctrl ditekan selama berlangsungnya event. Sama halnya, baris 55-56 mewarnai sel dengan merah jika kunci Shift ditekan. Untuk melakukan hal ini, Anda menggunakan properti shiftKey dari objek event.

Contoh ini mendemonstrasikan properti ctrlKey dan shiftKey dari objek event. Gambar 10.4 mencantumkan beberapa properti lintas-penjelajah dari objek event.

Properti
Penjelasan
altKey
Nilai ini true jika kunci Alt ditekan ketika event terjadi.

cancelBubble
Ditetapkan menjadi true untuk mencegah kondisi bubbling. Default adalah false.

clientX dan clientY
Koordinat dari kursor mouse di dalam area klien (misalnya, area aktif dimana halaman web ditampilkan, tidak termasuk scroolbar, navigation buttons, dll.

ctrlKey
Nilai ini true jika kunci Ctrl ditekan ketika event terjadi.

keyCode
Kode ASCII dari kunci yang ditekan pada event keyboard.

screenX dan screenY
Koordinat dari kursor mouse pada sistem koordinat layar.

shiftKey
Nilai ini true jika kunci Shift ditekan ketika event terjadi.

type
Nama dari event yang terjadi, tanpa prefiks “on”.

Gambar 10.4 Beberapa properti dari objek event


10.5 Rollover dengan onmouseover dan onmouseout
Dua event lain yang dipicu oleh pergerakan mouse adalah onmouseover dan onmouseout. Ketika kursor berpindah ke sebuah elemen, sebuah event onmouseover akan terjadi untuk elemen tersebut. Ketika kursor meninggalkan elemen, sebuah event onmouseout akan terjadi. Gambar 10.5 menggunakan kedua event ini untuk menghasilkan efek rollover yang memperbarui teks ketika kursor digerakkan.

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
<?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 10.5: onmouseoverout.html -->
<!-- Event onmouseover dan onmouseout. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Event onmouseover dan onmouseout</title>
        <style type = "text/css">
            body { background-color: wheat }
            table { border-style: groove;
                    text-align: center;
                    font-family: monospace;
                    font-weight: bold }
            td { width: 6em }
        </style>
        <script type = "text/javascript">
            <!--
            citra1 = new Image();
            citra1.src = "kepala1.gif";
            citra2 = new Image();
            citra2.src = "kepala2.gif";

            function atasMouse( e )
            {
                if ( !e )
                    var e = window.event;

                var target = getTarget( e );

                // menukar citra ketika mouse di atasnya
                if ( target.id == "kepala" )
                {
                    target.src = citra2.src;
                    return;
                } // akhir if

                // jika id sebuah elemen didefinisikan, tugaskan id kepada color
                // untuk mengubah warna teks dari kode heksa
                if ( target.id )
                    target.style.color = target.id;
            } // akhir fungsi atasMouse

            function luarMouse( e )
            {
                if ( !e )
                    var e = window.event;

                var target = getTarget( e );

                // menempatkan citra asli kembali ketika mouse menjauh
                if ( target.id == "kepala" )
                {
                    target.src = citra1.src;
                    return;
                } // akhir if

                // jika id sebuah elemen didefinisikan, tugaskan id kepada innerHTML
                // untuk menampilkan nama colordisplay the color name
                if ( target.id )
                    target.innerHTML = target.id;
            } // akhir fungsi luarMouse

            // menghasilkan e.srcElement atau e.target, mana yang ada
            function getTarget( e )
            {
                if ( e.srcElement )
                    return e.srcElement;
                else
                    return e.target;
            } // akhir fungsi getTarget

            document.onmouseover = atasMouse;
            document.onmouseout = luarMouse;
            // -->
        </script>
    </head>
    <body>
        <img src = "kepala1.gif" id = "kepala" alt = "Citra Kepala" />
        <p>Dapatkah Anda mengetahui sebuah warna dari nilai kode RGB
        heksadesimalnya? Lihat kode heksa berikut, tebak warnanya. Untuk
        melihat warna apa, gerakkan mouse ke atas kode heksa.
        Dengan memindahkan mouse keluar dari tabel kode heksa,
        sel akan menampilkan nama warna.</p>
        <table>
            <tr>
                <td id = "Black">#000000</td>
                <td id = "Blue">#0000FF</td>
                <td id = "Magenta">#FF00FF</td>
                <td id = "Gray">#808080</td>
            </tr>
            <tr>
                <td id = "Green">#008000</td>
                <td id = "Lime">#00FF00</td>
                <td id = "Maroon">#800000</td>
                <td id = "Navy">#000080</td>
            </tr>
            <tr>
                <td id = "Olive">#808000</td>
                <td id = "Purple">#800080</td>
                <td id = "Red">#FF0000</td>
                <td id = "Silver">#C0C0C0</td>
            </tr>
            <tr>
                <td id = "Cyan">#00FFFF</td>
                <td id = "Teal">#008080</td>
                <td id = "Yellow">#FFFF00</td>
                <td id = "White">#FFFFFF</td>
            </tr>
        </table>
    </body>
</html>





Gambar 10.5 Event onmouseover dan onmouseout


Untuk menciptakan efek rollover untuk citra, baris 20-23 menciptakan dua objek Image JavaScript, citra1 dan citra2. Citra citra1 ditampilkan ketika mouse berada di luar citra. Skrip menetapkan properti src dari tiap Image pada baris 21 dan 23.

Fungsi atasMouse dan luarMouse ditetapkan untuk memproses event onmouseover dan onmouseout pada baris 74-75. Kedua fungsi dimulai (baris 25-28 dan baris 45-48) dengan mendapatkan objek event dan menggunakan fungsi getTarget untuk mencari elemen yang menerima aksi. Karena perbedaan model event dari penjelajah, Anda memerlukan getTarget (didefinisikan pada baris 66-72) untuk menghasilkan simpul DOM yang menjadi target dari aksi. Pada Internet Explorer, simpul ini disimpan di dalam properti srcElement dari objek event. Pada Firefox, ia disimpan di dalam properti target dari objek event. Baris 68-71 menghasilkan simpul menggunakan properti yang sesuai untuk menyelesaikan perbedaan model event. Anda harus menggunakan fungsi getTarget (menggantikan this) karena Anda tidak mendefinisikan fungsi penanganan-event untuk tiap elemen di dalam document. Pada kasus ini, penggunaan this akan menghasilkan keseluruhan dokumen. Pada kedua luarMouse dan atasMouse, Anda menugaskan nilai balik dari getTarget kepada variabel target (baris 30 dan 50).

Baris 33-37 pada fungsi luarMouse menangani event onmouseover untuk citra kepala dengan menetapkan atribut srcnya (target.src) menjadi properti src dari objek Image yang sesuai (citra2.src). Tugas yang sama terjadi pada citra1 pada fungsi luarMouse (baris 53-57).

Skrip menangani event onmouseover untuk sel-sel tabel pada baris 41-42. Kode ini menguji apakah sebuah id ditetapkan, yang bernilai true hanya untuk sel-sel tabel kode heksadesimal dan citra kepala pada contoh ini. Jika elemen yang menerima aksi memiliki sebuah id, kode akan mengubah warna elemen agar sesuai dengan nama warna yang disimpan di dalam id. Seperti yang dapat Anda lihat, pada kode untuk table (baris 86-111), setiap elemen td yang memuat sebuah kode warna memiliki atribut id yang ditetapkan menjadi salah satu dari 16 warna dasar XHTML. Baris 61-62 menangani event onmouseout dengan mengubah teks pada sel tabel ketika kursor mouse meninggalkan kode heksadesimal tertentu.


10.6 Pemrosesan Formulir dengan onfocus dan onblur
Event onfocus dan onblur berguna ketika Anda berhubungan dengan elemen-elemen formulir ketika pengguna memasukkan data (Gambar 10.6). Event onfocus terjadi ketika sebuah elemen mendapatkan fokus (yaitu ketika pengguna mengklik sebuah bidang formulir atau ketika menggunakan kunci Tab untuk berpindah ke elemen formulir lain), dan event onblur terjadi ketika sebuah elemen kehilangan fokus, yang terjadi ketika kendali lain mendapatkan fokus.

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
<?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 10.6: onfocusblur.html -->
<!-- Mendemonstrasikan event onfocus dan onblur. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
    <title>Sebuah Formulir Menggunakan Event onfocus dan onblur</title>
        <style type = "text/css">
            .tip { font-family: sans-serif;
                   color: blue;
                   font-size: 12px }
        </style>
        <script type = "text/javascript">
            <!--
            var bantuArray =
                [ "Masukkan nama Anda pada kotak masukan ini.", // elemen 0
                  "Masukkan alamat e-mail Anda pada kotak masukan ini, " +
                  "dengan format user@domain.", // elemen 1
                  "Periksa kotak ini jika Anda menyenangi situs kami.", // elemen 2
                  "Pada kotak ini, masukkan komentar Anda agar " +
                  "kami dapat membacanya.", // elemen 3
                  "Tombol ini menyerahkan formulir kepada " +
                  "skrip sisi-server.", // elemen 4
                  "Tombol ini menghapus formulir.", // elemen 5
                  "" ]; // elemen 6

            function bantuTeks( jumPesan )
            {
                document.getElementById( "tip" ).innerHTML =
                    bantuArray[ jumPesan ];
            } // akhir fungsi bantuTeks
            // -->
        </script>
    </head>
    <body>
        <form id = "formKu" action = "">
            <div>
            Nama: <input type = "text" name = "nama"
                onfocus = "bantuTeks(0)" onblur = "bantuTeks(6)" /><br />
            E-mail: <input type = "text" name = "e-mail"
                onfocus = "bantuTeks(1)" onblur = "bantuTeks(6)" /><br />
            Klik ini jika Anda menyukai situs ini
            <input type = "checkbox" name = "like" onfocus =
                "bantuTeks(2)" onblur = "bantuTeks(6)" /><br /><hr />

            Komentar Anda?<br />
            <textarea name = "komentar" rows = "5" cols = "45"
                onfocus = "bantuTeks(3)" onblur = "bantuTeks(6)"></textarea>
            <br />
            <input type = "submit" value = "Submit" onfocus =
                "bantuTeks(4)" onblur = "bantuTeks(6)" />
            <input type = "reset" value = "Reset" onfocus =
                "bantuTeks(5)" onblur = "bantuTeks(6)" />
            </div>
        </form>
        <div id = "tip" class = "tip"></div>
    </body>
</html>
  



Gambar 10.6 Mendemonstrasikan event onfocus dan onblur


Pada baris 31-32, skrip mengubah teks di dalam div di bawah formulir (baris 58) berdasarkan jumPesan yang dilewatkan kepada fungsi bantuTeks (baris 29-33). Setiap elemen formulir, seperti masukan nama pada baris 40-41,  melewatkan nilai-nilai yang berbeda kepada fungsi bantuTeks ketika ia mendapatkan fokus (dan event onfocus terjadi). Nilai-nilai tersebut dipakai sebagai indeks untuk bantuArray, yang dideklarasikan dan diinisialisasi pada baris 17-27 dan menyimpan pesan bantuan. Ketika sebuah elemen kehilangan fokus, ia melewatkan nilai 6 kepada bantuTeks untuk menghapus div tip (perhatikan bahwa string kosong “” disimpan di elemen terakhir array).


10.7 Pemrosesan Formulir dengan onsubmit dan onreset
Dua event lain untuk pemrosesan formulir adalah onsubmit dan onreset. Kedua event ini terjadi ketika sebuah formulir diserahkan (submit) atau direset (Gambar 10.7). Fungsi daftarkanEvent (baris 35-46) mendaftarkan fungsi penanganan-event untuk formulir setelah tubuh dimuat.

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
<?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 10.7: onsubmitreset.html -->
<!-- Mendemonstrasikan event onsubmit dan onreset. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Sebuah Formulir Menggunakan onsubmit dan onreset</title>
        <style type = "text/css">
            .tip { font-family: sans-serif;
                   color: blue;
                   font-size: 12px }
        </style>
        <script type = "text/javascript">
            <!--
            var bantuArray =
                [ "Masukkan nama Anda pada kotak masukan ini.", // elemen 0
                  "Masukkan alamat e-mail Anda pada kotak masukan ini, " +
                  "dengan format user@domain.", // elemen 1
                  "Periksa kotak ini jika Anda menyenangi situs kami.", // elemen 2
                  "Pada kotak ini, masukkan komentar Anda agar " +
                  "kami dapat membacanya.", // elemen 3
                  "Tombol ini menyerahkan formulir kepada " +
                  "skrip sisi-server.", // elemen 4
                  "Tombol ini menghapus formulir.", // elemen 5
                  "" ]; // elemen 6

            function bantuTeks( jumPesan )
            {
                document.getElementById( "tip" ).innerHTML =
                    bantuArray[ jumPesan ];
            } // akhir fungsi bantuTeks

            function daftarkanEvent()
            {
                document.getElementById( "formKu" ).onsubmit = function()
                {
                    return confirm( "Apakah Anda ingin menyerahkan formulir ini?" );
                } // akhir fungsi anonim

                document.getElementById( "formKu" ).onreset = function()
                {
                    return confirm( "Apakah Anda ingin mereset formulir ini?" );
                } // akhir fungsi anonim
            } // akhir fungsi daftarkanEvent
            // -->
        </script>
    </head>
    <body onload = "daftarkanEvent()">
        <form id = "formKu" action = "">
            <div>
            Nama: <input type = "text" name = "nama"
                onfocus = "bantuTeks(0)" onblur = "bantuTeks(6)" /><br />
            E-mail: <input type = "text" name = "e-mail"
                onfocus = "bantuTeks(1)" onblur = "bantuTeks(6)" /><br />
            Klik ini jika Anda menyukai situs ini
            <input type = "checkbox" name = "like" onfocus =
                "bantuTeks(2)" onblur = "bantuTeks(6)" /><br /><hr />

            Komentar Anda?<br />
            <textarea name = "komentar" rows = "5" cols = "45"
                onfocus = "bantuTeks(3)" onblur = "bantuTeks(6)"></textarea>
            <br />
            <input type = "submit" value = "Submit" onfocus =
                "bantuTeks(4)" onblur = "bantuTeks(6)" />
            <input type = "reset" value = "Reset" onfocus =
                "bantuTeks(5)" onblur = "bantuTeks(6)" />
            </div>
        </form>
        <div id = "tip" class = "tip"></div>
    </body>
</html>
  





Gambar 10.7 Mendemonstrasikan event onsubmit dan onreset


Baris 37-40 dan baris 42-45 mengintroduksi beberapa konsep baru. Baris 37 mendapatkan elemen form (“formKu”, baris 51-70), kemudian baris 37-40 menugaskan sebuah fungsi anonim kepada properti onsubmit. Fungsi anonim didefinisikan tanpa nama. Ia diciptakan hampir sama dengan fungsi biasa, dimana tidak ada pengenal yang ada setelah katakunci function. Notasi ini berguna ketika menciptakan sebuah fungsi yang hanya bertujuan untuk menugaskan fungsi tersebut kepada sebuah fungsi penanganan-event. Anda tidak dapat memanggil sendiri fungsi tersebut, jadi Anda tidak perlu memberikannya nama.

Fungsi anonim (baris 37-40) yang ditugaskan kepada properti onsubmit dari formKu dieksekusi untuk merespon pengguna yang telah menyerahkan formulir (dengan mengklik tombol Submit atau menekan kunci Enter). Baris 39 mengintroduksi metode confirm dari objek window. Sama seperti alert, Anda tidak perlu memberikan prefiks (nama window dan operator dot) pada pemanggilan metode confirm. Dialog confirm dipakai untuk bertanya kepada pengguna, dengan memberikan sebuah tombol OK dan sebuah tombol Cancel. Jika pengguna menekan OK, maka dialog confirm akan menghasilkan true; sebaliknya, confirm menghasilkan false.

Fungsi-fungsi penanganan-event untuk event onsubmit dan onreset hanya menghasilkan nilai dari dialog confirm, yang menanyakan pengguna jika ia yakin ingin menyerahkan atau menghapus formulir (baris 39 dan 44). Dengan menghasilkan true atau false, fungsi-fungsi penanganan-event menentukan aksi untuk event tertentu. Pada kasus ini, aksi yang akan dilakukan adalah menyerahkan atau menghapus formulir.


10.8 Event Bubbling
Event bubbling merupakan sebuah proses dimana event yang terjadi pada elemen anak akan “mengambang” ke elemen induk. Ketika sebuah event terjadi pada suatu elemen, pertama-tama ia akan dikirim ke fungsi penanganan-event pada elemen tersebut (jika ada), kemudian ia akan dikirim ke fungsi penanganan-event pada induk (jika ada). Ini akan menghasilkan penanganan event yang tidak diinginkan. Jika Anda ingin menangani sebuah event pada elemen anak saja,  Anda harus membatalkan event bubbling dari kode penanganan-event pada elemen anak tersebut dengan menggunakan properti cancelBubble dari objek event, seperti ditunjukkan pada Gambar 10.8.

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
<?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 10.8: bubbling.html -->
<!-- Membatalkan event bubbling. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Event Bubbling</title>
        <script type = "text/javascript">
            <!--
            function klikDokumen()
            {
                alert( "Anda mengklik dokumen." );
            } // akhir fungsi klikDokumen

            function bubble( e )
            {
                if ( !e )
                    var e = window.event;

                alert( "Ini akan mengambang." );
                    e.cancelBubble = false;
            } // akhir fungsi bubble

            function tidakBubble( e )
            {
                if ( !e )
                    var e = window.event;

                alert( "Ini tidak akan mengambang." );
                    e.cancelBubble = true;
            } // akhir fungsi tidakBubble
 
            function daftarkanEvent()
            {
                document.onclick = klikDokumen;
                document.getElementById( "bubble" ).onclick = bubble;
                document.getElementById( "tidakBubble" ).onclick = tidakBubble;
            } // akhir fungsi daftarkanEvent
            // -->
        </script>
     </head>
     <body onload = "daftarkanEvent()">
         <p id = "bubble">Bubbling diaktifkan.</p>
         <p id = "tidakBubble">Bubbling dinonaktifkan.</p>
     </body>
</html>





Gambar 10.8 Membatalkan event bubbling


Pengklikan elemen p yang pertama (baris 45) akan memicu sebuah pemanggilan terhadap bubble. Kemudia, karena baris 37 mendaftarkan event onclick dari objek document, maka klikDokumen juga akan dipanggil. Ini terjadi karena event onclick mengambang ke document. Ini bisa jadi merupakan hasil yang tidak Anda inginkan. Pengklikan elemen p yang kedua (baris 46) akan memanggil tidakBubble, yang menonaktifkan event bubbling untuk event ini dengan menetapkan properti cancelBubble dari objek event menjadi true.

10.9 Event-Event Lain
Semua event yang dirangkum pada bab ini merupakan event yang paling umum digunakan. Beberapa event yang didukung oleh Firefox dan Internet Explorer diberikan dengan penjelasannya pada Gambar 10.9.

Event
Terjadi ketika
onabort
Transfer citra diinterupsi oleh pengguna.

onchange
Sebuah pilihan baru diberikan pada suatu elemen terseleksi, atau ketika sebuah masukan teks berubah dan elemen kehilangan fokus.

onclick
Pengguna menglik menggunakan mouse.

ondblclick
Mouse diklik ganda.

onfocus
Sebuah elemen formulir mendapatkan fokus.

onkeydown
Pengguna menekan sebuah kunci ke bawah.

onkeypress
Pengguna menekan dan melepaskan sebuah kunci.

onkeyup
Pengguna melepaskan sebuah kunci.

onload
Sebuah elemen dan semua anaknya dimuat (loaded).

onmousedown
Sebuah tombol mouse ditekan ke bawah.

onmousemove
Mouse bergerak atau berpindah.

onmouseout
Mouse meninggalkan sebuah elemen.

onmouseover
Mouse memasuki sebuah elemen.

onmouseup
Sebuah tombol mouse dilepaskan

onreset
Sebuah form dihapus (direset), ketika pengguna menekan tombol reset.

onresize
Ukuran sebuah objek berubah (misalnya, ketika pengguna mengubah ukuran window atau frame).

onselect
Seleksi teks dimulai (berlaku untuk input atau textarea).

onsubmit
Sebuah formulir diserahkan.

Gambar 10.9 Event-event lintas-penjelajah






No comments:

Post a Comment