Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="body" >
2
<h1 id="6701">Event DOM dan Javascript</h1>
3
 
4
<h2 id="6702">Penanganan event dasar</h2>
5
 
6
<p id="840735" class="block-content">Sintaks untuk bekerja dengan event terlihat seperti kode di bawah.</p>
7
 
8
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840254">
9
Event.observe(element, name, observer, [useCapture]);
10
</com:TTextHighlighter>
11
 
12
<p id="840736" class="block-content">Menganggap untuk saat ini kita ingin mengamati sebuah link yang diklik, kita dapat melakukan yang berikut:</p>
13
 
14
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840255">
15
// &lt;a id="clicker" href="http://foo.com"&gt;Click me&lt;/a&gt;
16
Event.observe('clicker', 'click', function(event)
17
{
18
    alert('clicked!');
19
});
20
</com:TTextHighlighter>
21
 
22
<p id="840737" class="block-content">Jika kita menginginkan untuk mendapatkan elemen yang memicu event, kita melakukan ini:</p>
23
 
24
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840256">
25
Event.observe('clicker', 'click', function(event)
26
{
27
    alert(Event.element(event));
28
});
29
</com:TTextHighlighter>
30
 
31
<h2 id="6703">Mengamati tekanan tombol</h2>
32
 
33
<p id="840738" class="block-content">Jika kita ingin mengamati tekanan tombol untuk seluruh dokumen, kita dapat melakukan yang berikut:</p>
34
 
35
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840257">
36
Event.observe(document, 'keypress', function(event)
37
{
38
    if(Event.keyCode(event) == Event.KEY_TAB)
39
        alert('Tab Pressed');
40
});
41
</com:TTextHighlighter>
42
 
43
<p id="840739" class="block-content">Dan katakanlah kita ingin melacak apa yang telak diketikan:</p>
44
 
45
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840258">
46
Event.observe('search', 'keypress', function(event)
47
{
48
    Element.update('search-results', $F(Event.element(event)));
49
});
50
</com:TTextHighlighter>
51
 
52
<p id="840740" class="block-content">Prototipe mendefinisikan properti di dalam obyek event untuk beberapa dari tombol yang lebih umum, maka jangan ragu-ragu untuk mencari di sekitar Prototype guna melihat yang mana saja itu.</p>
53
 
54
<p id="840741" class="block-content">Catatan terakhir pada event tekanan tombol; Jika Anda ingin mendeteksi klik kiri, Anda bisa menggunakan <tt>Event.isLeftClick(event)</tt>.</p>
55
 
56
<h2 id="6704">Mendapatkan koordinat dari penunjuk mouse</h2>
57
 
58
<p id="840742" class="block-content">Tarik dan jatuhkan, pengukuran ulang elemen dinamis, permainan, dan lebih banyak lagi, semuanya memerlukan kemampuan untuk melacak lokasi X dan Y dari mouse. Prototipe menjadikan hal ini cukup sederhana. Kode di bawah melacak posisi X dan Y dari mouse dan memindahkan nilainya ke dalam kotak input bernama mouse.</p>
59
 
60
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840259">
61
Event.observe(document, 'mousemove', function(event)
62
{
63
    $('mouse').value = "X: " + Event.pointerX(event) +
64
                       "px Y: " + Event.pointerY(event) + "px";
65
});
66
</com:TTextHighlighter>
67
 
68
<p id="840743" class="block-content">Jika kita ingin mengamati lokasi mouse saat ia melewati elemen tertentu, cukup ubah argumen dokumen ke id atau elemen yang relevan.</p>
69
 
70
<h2 id="6705">Menghentikan Propagasi</h2>
71
 
72
<p id="840744" class="block-content"><tt>Event.stop(event)</tt> akan menghentikan propagasi sebuah event .</p>
73
 
74
<h2 id="6706">Event, Penyatuan, dan Obyek</h2>
75
 
76
<p id="840745" class="block-content">Sejauh ini semuanya sudah jelas, tapi sesuatu mulai menjadi sedikit lebih rumit ketika Anda perlu bekerja dengan event dalam lingkungan obyek-terorientasi. Anda harus berhadapan dengan penyatuan dan sintaks yang terlihat aneh yang memerlukan beberapa waktu bagi Anda untuk mengetahuinya.</p>
77
 
78
<p id="840746" class="block-content">Mari kita lihat pada beberapa kode agar Anda bisa mendapatkan pengertian yang lebih baik atas apa yang sedang saya bicarakan.</p>
79
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840260">
80
EventDispenser = Class.create();
81
EventDispenser.prototype =
82
{
83
  initialize: function(list)
84
  {
85
    this.list = list;
86
 
87
    // Amati klik pada item list kita
88
    $$(this.list + " li").each(function(item)
89
    {
90
        Event.observe(item, 'click', this.showTagName.bindEvent(this));
91
    }.bind(this));
92
 
93
    // Amati saat tombol pada keyboard ditekan.
94
    // Dalam pengamat, kita memeriksa
95
    // tombol tab dan memunculkan pesan jika ditekan.
96
    Event.observe(document, 'keypress', this.onKeyPress.bindEvent(this));
97
 
98
    // Amati kotak pencarian kita yang palsu.  Ketika pengguna mengetik
99
    // sesuatu ke dalam kotak, pengamat akan mengambil nilai (-1) itu
100
    // dan memutakhirkan hasil pencarian div dengannya.
101
    Event.observe('search', 'keypress', this.onSearch.bindEvent(this));
102
 
103
    Event.observe(document, 'mousemove', this.onMouseMove.bindEvent(this));
104
  },
105
 
106
  // Fungsi bebas untuk merespon event
107
  showTagName: function(event)
108
  {
109
    alert(Event.element(event).tagName);
110
  },
111
 
112
  onKeyPress: function(event)
113
  {
114
    var code = event.keyCode;
115
    if(code == Event.KEY_TAB)
116
        alert('Tab key was pressed');
117
  },
118
 
119
  onSearch: function(event)
120
  {
121
    Element.update('search-results', $F(Event.element(event)));
122
  },
123
 
124
  onMouseMove: function(event)
125
  {
126
    $('mouse').value = "X: " + Event.pointerX(event) +
127
                "px Y: " + Event.pointerY(event) + "px";
128
  }
129
}
130
</com:TTextHighlighter>
131
<p id="840747" class="block-content">Wah! Apa yang terjadi di sini? Kita telah mendefinisikan kelas kustom kita <tt>EventDispenser</tt>. Kita akan menggunakan kelas ini untuk menyiapkan event untuk dokumenkita. Banyak dari kode ini ditulis ulang yang kita lihat di awal kecuali kali ini, kita bekerja dari dalam sebuah obyek.</p>
132
 
133
<p id="840748" class="block-content">Melihat metode <tt>initialize</tt>, sebenarnya kita dapat melihat bagaimana sesuatu menjadi berbeda sekarang. Lihat kode di bawah ini:</p>
134
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840261">
135
// Observe clicks on our list items
136
$$(this.list + " li").each(function(item)
137
{
138
    Event.observe(item, 'click', this.showTagName.bindEvent(this));
139
}.bind(this));
140
</com:TTextHighlighter>
141
 
142
<p id="840749" class="block-content">Kita mendapatkan iterator, penyatuan dan semua hal lainnya. Mari kita rinci apa yang dikerjakan kode ini.</p>
143
 
144
<p id="840750" class="block-content">Pertama kita memburu koleksi elemen berdasarkan selektor CSS. Ini menggunakan fungsi selektor Prototipe <tt>$$()</tt>.
145
Setelah kita menemukan daftar item kita berhadapan dengan apa yang kita kirim ke dalam setiap iterasi di mana kita akan menambahkan pengamat kita.</p>
146
 
147
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840262">
148
Event.observe(item, 'click', this.showTagName.bindEvent(this));
149
</com:TTextHighlighter>
150
 
151
<p id="840751" class="block-content">Sekarang, melihat kode di atas, Anda akan mencatat fungsi <tt>bindEvent</tt>. Ini mengambil metode sebelumnya <tt>showTagName</tt> dan memperlakukannya sebagai metode yang akan dipicu ketika seseorang mengklik salah satu dari item daftar kita.</p>
152
 
153
<p id="840752" class="block-content">Anda juga akan mencatat bahwa kita mengirimkan ini sebagai argumen ke fungsi <tt>bindEvent</tt>.
154
Ini membolehkan kita untuk mereferensi obyek dalam konteks <tt>EventDispenser</tt>
155
di dalam fungsi <tt>showTagName(event)</tt> kita. Jika fungsi <tt>showTagName</tt> memerlukan parameter tambahan, Anda melampirkannya ke parameter terakhir dari <tt>bindEvent</tt>. Sebagai contoh</p>
156
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840263">
157
this.showTagName.bindEvent(this, param1, param2);
158
 
159
//di mana fungsi showTagName didefinisikan seperti
160
showTime : function (event, param1, param2) { ... }
161
</com:TTextHighlighter>
162
 
163
<p id="840753" class="block-content">Selanjutnya, Anda akan melihat <tt>bind(this)</tt> yang dilampirkan ke fungsi iterator.
164
Ini sama sekali tidak berkaitan dengan event, ia berada di sini untuk membolehkan saya menggunakan <tt>this</tt> di dalam iterator. Jika kita tidak menggunakan <tt>bind(this)</tt>, saya tidak bisa mereferensi metode <tt>showTagName</tt> di dalam iterator.</p>
165
 
166
<p id="840754" class="block-content">Ok, kita berlanjut untuk melihat metode kita yang sebenarnya dipanggil saat terjadi event. Karena kita sudah berhadapan dengan <tt>showTagName</tt>, mari kita lihat itu.</p>
167
 
168
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840264">
169
showTagName: function(event)
170
{
171
    alert(Event.element(event).tagName);
172
}
173
</com:TTextHighlighter>
174
 
175
<p id="840755" class="block-content">Seperti yang Anda lihat, fungsi ini menerima satu argumen--event.
176
Agar kita mendapatkan elemen yang memicu event kita perlu mengirimkan argumen ke <tt>Event.element</tt>. Sekarang kita dapat memanipulasinya kapan saja.</p>
177
 
178
<p id="840756" class="block-content">Ini mencakup bagian yang paling membingungkan dari kode kita. Teks di atas juga relevan untuk bagian sisa dari kode kita. Jika ada sesuatu mengenai ini yang tidak Anda mengerti, jangan ragu-ragu untuk mengajukan pertanyaan dalam forum.</p>
179
 
180
<h2 id="6707">Menghapus Pendengar Event</h2>
181
 
182
<p id="840757" class="block-content">Yang satu ini melontarkan saya dari lingkaran untuk pertama kali saya mencoba menggunakannya.
183
Saya mencoba sesuatu yang mirip dengan apa yang saya lakukan dalam pemanggilan <tt>Event.observe</tt> dengan kekecualian penggunaan <tt>stopObserving</tt>, tapi tidak ada yang berubah. Dengan kata lain, kode di bawah ini <b>TIDAK</b> bekerja.</p>
184
 
185
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840265">
186
$$(this.list + " li").each(function(item)
187
{
188
    Event.stopObserving(item, 'click', this.showTagName);
189
}.bind(this));
190
</com:TTextHighlighter>
191
 
192
<p id="840758" class="block-content">Apa yang terjadi di sini? Alasan ini tidak bekerja karena tidak ada penunjuk ke pengamat. Ini berarti bahwa ketika kita mengirimkan <tt>this.showTagName</tt> dalam metode <tt>Event.observe</tt> sebelumnya, kita mengirimkannya sebagai fungsi anonim. Kita tidak bisa mereferensi fungsi anonim karena ia tidak mempunyai penunjuk.</p>
193
 
194
<p id="840759" class="block-content">Lalu bagaimana kita yakin pekerjaan diselesaikan? Semua yang kita perlukan adalah memberikan fungsi mengamati penunjuk, atau kelompok versi bebas: Setel variabel yang mengarah ke <tt>this.showTagName</tt>. Ok, mari kita ubah kode kita sedikit.</p>
195
 
196
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840266">
197
this.showTagObserver = this.showTagName.bindEvent(this);
198
 
199
// Amati klik pada item list kita
200
$$(this.list + " li").each(function(item)
201
{
202
    Event.observe(item, 'click', this.showTagObserver);
203
}.bind(this));
204
</com:TTextHighlighter>
205
 
206
<p id="840760" class="block-content">Sekarang kita bisa menghapus pendengar event dari daftar kita seperti ini:</p>
207
<com:TTextHighlighter Language="javascript" CssClass="source block-content" id="code_840267">
208
$$(this.list + " li").each(function(item)
209
{
210
    Event.stopObserving(item, 'click', this.showTagObserver);
211
}.bind(this));
212
</com:TTextHighlighter>
213
 
214
<div class="last-modified">$Id: Scripts2.page 1650 2007-01-24 06:55:32Z wei $</div></com:TContent>