ฟังก์ชัน Javascript addEventListener

ฉันยังใหม่กับ Event Handlers และฉันเจอโค้ดที่เขียนไว้ด้านล่าง

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

การเขียนโค้ดเดียวกันกับมีความแตกต่างหรือไม่

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

ในที่สุดเราก็เรียกใช้ฟังก์ชันเดียวกัน ดังนั้นมันจะสร้างความแตกต่างหรือมีข้อได้เปรียบในการเขียนในลักษณะข้างต้นหรือไม่


person Bazinga777    schedule 06.03.2013    source แหล่งที่มา
comment
หลังจะไม่ทำสิ่งที่คุณคิด   -  person John Dvorak    schedule 06.03.2013
comment
หลังเป็นข้อผิดพลาดทางไวยากรณ์   -  person John Dvorak    schedule 06.03.2013
comment
คุณกำลังส่งคืนค่าของ InitialiseMediaPlayer ไปยัง Listener เหตุการณ์ ลบการร้องขอ () และจะเหมือนกัน   -  person danronmoon    schedule 06.03.2013
comment
@danronmoon จนถึงค่าส่งคืน   -  person John Dvorak    schedule 06.03.2013


คำตอบ (4)


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

จะดำเนินการ initialiseMediaPlayer เมื่อโหลดเนื้อหา dom

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

เป็นข้อผิดพลาดทางไวยากรณ์ หากคุณลบอัฒภาค:

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

เรียก initialiseMediaPlayer ทันที จากนั้นส่งคืนค่าที่ส่งคืน (ซึ่งอาจ ไม่ใช่ ฟังก์ชัน) ไปที่ addEventListener สิ่งนี้จะไม่เป็นไปตามที่ต้องการ


คุณทำได้

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

(ลบวงเล็บ = การเรียกใช้ฟังก์ชัน) จากนั้น initialiseMediaPlayer จะถูกดำเนินการกับเนื้อหา dom ที่โหลด และดำเนินการตามที่ต้องการ

อย่างไรก็ตาม ไม่เหมือนกับกรณีก่อนหน้านี้ initialiseMediaPlayer จะได้รับอาร์กิวเมนต์ที่กำหนดโดยเบราว์เซอร์จริงๆ นอกจากนี้เบราว์เซอร์ยังได้รับค่าส่งคืนอีกด้วย ในกรณีของ DOMContentLoaded เป็นไปได้มากว่าเรื่องนี้ไม่สำคัญมากนัก

นอกจากนี้คุณยังหลีกเลี่ยงการสร้างฟังก์ชันที่ไม่ระบุชื่อเพิ่มเติมอีกหนึ่งรายการหากคุณส่งผ่าน initialiseMediaPlayer โดยตรง ขอย้ำอีกครั้งว่าผลกระทบนี้ไม่สามารถรับรู้ได้จากมุมมองของผู้ใช้

person John Dvorak    schedule 06.03.2013
comment
จะเกิดอะไรขึ้นถ้า InitialiseMediaPlayer ได้รับพารามิเตอร์? - person Fernando Montoya; 01.06.2015
comment
@montogeek พารามิเตอร์นั้นจะเป็น วัตถุเหตุการณ์ที่มีคุณสมบัติที่โดดเด่นที่สุดคือเอกสาร มันชี้ไปที่ ฉันเดิมพันได้เลยว่าผู้เริ่มต้นจะไม่สังเกตเห็นด้วยซ้ำว่ามีวัตถุเหตุการณ์ถูกส่งผ่านไป - person John Dvorak; 01.06.2015
comment
ขอบคุณ ฉันเข้าใจแล้ว โดยใช้ .bind แก้ปัญหาของฉัน - person Fernando Montoya; 02.06.2015

1). ใช่มีความแตกต่างอย่างมาก เวอร์ชันที่สองจะเกิดข้อผิดพลาด แต่แม้ว่าคุณจะแก้ไขแบบนี้:

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

initialiseMediaPlayer จะไม่ถูกเรียกใช้บน DOMContentLoaded เนื่องจาก () ทำให้มันดำเนินการทันที ในขณะที่คุณต้องส่งต่อการอ้างอิงไปยัง ฟังก์ชัน ไม่ใช่ผลลัพธ์

2). ความแตกต่างที่สำคัญอีกประการหนึ่งคือ บริบทของการร้องขอ

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

initialiseMediaPlayer จะถูกเรียกใช้ในบริบทของวัตถุ document ในขณะที่เวอร์ชันแรกจะถูกเรียกในบริบทของวัตถุ Window

person dfsq    schedule 06.03.2013
comment
ฟังดูสับสนเล็กน้อย แต่มันทำให้สิ่งต่าง ๆ ชัดเจนขึ้นมาก.. ขอบคุณมาก - person Bazinga777; 06.03.2013
comment
บริบทหมายความว่า this จะอ้างอิงถึงวัตถุต่างๆ ภายในฟังก์ชันของคุณ - person dfsq; 06.03.2013

อาร์กิวเมนต์ที่สองบนฟังก์ชัน addEventListener() ยอมรับ ฟังก์ชันประเภท ดังนั้นคุณไม่สามารถผ่าน initialiseMediaPlayer(); ได้เนื่องจากนั่นคือการเรียกใช้ฟังก์ชัน

สิ่งที่คุณสามารถทำได้คือ:

var onDOMContentLoaded = function() {
    initialiseMediaPlayer();
};
document.addEventListener("DOMContentLoaded", onDOMContentLoaded, false);
person Amy    schedule 06.03.2013
comment
ขอบคุณครับ กำลังคิดว่าจะเหมือนกันเลย - person Bazinga777; 06.03.2013

ในกรณีแรก

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

ฟังก์ชั่นที่ไม่ระบุชื่อ function(){initialiseMediaPlayer();} ได้รับการลงทะเบียนเพื่อให้ถูกทริกเกอร์เมื่อเหตุการณ์ของเอกสาร 'DOMContentLoaded' ได้รับการทริกเกอร์

ในกรณีที่สอง:

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

สิ่งที่ลงทะเบียนเป็นผู้ฟังเหตุการณ์คือผลลัพธ์ของนิพจน์ initialiseMediaPlayer()

ใช่ มันมีความแตกต่าง :)

person Francisco Meza    schedule 06.03.2013