Fungsi addEventListener Javascript

Saya baru mengenal Event Handler dan saya menemukan kode yang tertulis di bawah

document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

Apakah ada perbedaan dalam penulisan kode yang sama seperti

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

Pada akhirnya kita memanggil fungsi yang sama, jadi apakah ada bedanya atau adakah keuntungan menuliskannya dengan cara di atas?


person Bazinga777    schedule 06.03.2013    source sumber
comment
Yang terakhir tidak akan melakukan apa yang Anda pikirkan   -  person John Dvorak    schedule 06.03.2013
comment
Yang terakhir adalah kesalahan sintaksis   -  person John Dvorak    schedule 06.03.2013
comment
Anda meneruskan nilai kembalian inisialisasiMediaPlayer ke pendengar acara. Hapus doa () dan keduanya akan sama   -  person danronmoon    schedule 06.03.2013
comment
@danronmoon hingga nilai pengembalian   -  person John Dvorak    schedule 06.03.2013


Jawaban (4)


document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

Akan mengeksekusi initialiseMediaPlayer ketika konten dom dimuat.

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

adalah kesalahan sintaksis; jika Anda menghapus titik koma:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer(), false);

segera memanggil initialiseMediaPlayer, lalu meneruskan nilai yang dikembalikan (yang kemungkinan bukan merupakan fungsi) ke addEventListener. Ini tidak akan berjalan sesuai keinginan.


Anda dapat melakukan

    document.addEventListener("DOMContentLoaded", initialiseMediaPlayer, false);

(hilangkan tanda kurung = pemanggilan fungsi). Kemudian initialiseMediaPlayer akan dieksekusi pada konten dom yang dimuat, dan bertindak sesuai keinginan.

Namun, tidak seperti kasus sebelumnya, initialiseMediaPlayer sebenarnya akan menerima argumen yang diberikan oleh browser. Selain itu, nilai kembaliannya diterima oleh browser. Dalam kasus DOMContentLoaded, kemungkinan besar ini tidak terlalu menjadi masalah.

Anda juga menghindari pembuatan satu fungsi anonim tambahan jika Anda meneruskan initialiseMediaPlayer secara langsung. Sekali lagi, efeknya tidak terlalu terlihat dari sudut pandang pengguna.

person John Dvorak    schedule 06.03.2013
comment
Bagaimana jika inisialisasiMediaPlayer menerima parameter? - person Fernando Montoya; 01.06.2015
comment
@montogeek parameter tersebut akan menjadi objek peristiwa yang propertinya paling menonjol adalah dokumen itu menunjuk ke. Saya yakin Anda penginisialisasi bahkan tidak akan menyadari ada objek acara yang diteruskan ke sana. - person John Dvorak; 01.06.2015
comment
Terima kasih, saya menemukan jawabannya, menggunakan .bind selesaikan masalah saya. - person Fernando Montoya; 02.06.2015

1). Ya, ada perbedaan besar. Versi kedua akan menimbulkan kesalahan. Tetapi meskipun Anda memperbaikinya seperti ini:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer(), false);

initialiseMediaPlayer tidak akan dipanggil pada DOMContentLoaded karena () membuatnya langsung dieksekusi, sementara Anda harus meneruskan referensi ke fungsi, bukan hasilnya.

2). Perbedaan signifikan lainnya adalah konteks pemanggilan.

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer, false);

initialiseMediaPlayer akan dipanggil dalam konteks objek document. Sedangkan versi pertama akan dipanggil dalam konteks objek Window.

person dfsq    schedule 06.03.2013
comment
kedengarannya agak membingungkan tapi itu membuat segalanya lebih jelas..terima kasih banyak - person Bazinga777; 06.03.2013
comment
Konteks berarti this akan merujuk ke objek berbeda di dalam fungsi Anda. - person dfsq; 06.03.2013

Argumen kedua pada fungsi addEventListener() menerima fungsi tipe. Jadi Anda tidak dapat meneruskan initialiseMediaPlayer(); karena itu adalah pemanggilan fungsi.

Yang dapat Anda lakukan adalah:

var onDOMContentLoaded = function() {
    initialiseMediaPlayer();
};
document.addEventListener("DOMContentLoaded", onDOMContentLoaded, false);
person Amy    schedule 06.03.2013
comment
Terima kasih, saya berpikir itu adalah hal yang sama. - person Bazinga777; 06.03.2013

dalam kasus pertama

document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

fungsi anonim function(){initialiseMediaPlayer();} didaftarkan untuk dipicu ketika peristiwa dokumen 'DOMContentLoaded' dipicu

dalam kasus kedua:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

apa yang didaftarkan sebagai pendengar acara adalah hasil dari ekspresi initialiseMediaPlayer()

jadi, ya, ada perbedaan :)

person Francisco Meza    schedule 06.03.2013