โดยปกติแล้วเรามักจะเขียนวัตถุเหตุการณ์ดังนี้:
ฟังก์ชั่น getEvent (เหตุการณ์) {
กลับเหตุการณ์ ||. window.event // IE:window.event
-
หากไม่มีพารามิเตอร์ ก็สามารถเขียนเป็นได้ (ไม่ใช่ IE: ออบเจ็กต์เหตุการณ์จะถูกส่งไปยังฟังก์ชันการประมวลผลเหตุการณ์ที่เกี่ยวข้องโดยอัตโนมัติและเป็นพารามิเตอร์แรก):
ฟังก์ชั่น getEvent() {
กลับข้อโต้แย้ง [0] ||. window.event // IE: window.event
-
วิธีเขียนนี้จะไม่มีปัญหาในการทำงานบนเบราว์เซอร์อื่นที่ไม่ใช่ Firefox (เวอร์ชันทดสอบ: 3.0.12 เหมือนกันด้านล่าง) แต่เหตุใด Firefox จึงเป็นข้อยกเว้น ลองใช้สถานการณ์เช่นนี้:
<button id="btn" onclick="foo()">ปุ่ม</button>
<สคริปต์>
ฟังก์ชั่นฟู(){
var e = getEvent();
การแจ้งเตือน (e);}
</สคริปต์>
ผลลัพธ์การทำงานไม่ได้กำหนดไว้ใน Firefox เพราะเหตุใด
การโทรใน Firefox เป็นเช่นนี้จริง ๆ แล้วการโทรครั้งแรกคือ:
ฟังก์ชั่น onclick (เหตุการณ์) {
ฟู();
-
จากนั้นการโทรจะดำเนินการ:
ฟังก์ชั่นฟู(){
var e = getEvent();
การแจ้งเตือน (e);
-
คุณจะพบว่า foo() ใน onclick="foo()" ใต้ Firefox ไม่สามารถส่งผ่านพารามิเตอร์ออบเจ็กต์เหตุการณ์ได้โดยอัตโนมัติ แต่จะถูกส่งผ่านไปยังฟังก์ชัน onclick ที่สร้างโดยระบบตามค่าเริ่มต้น ในตัวอย่างนี้ เราสามารถส่งผ่าน getEvent.caller .caller.arguments[ 0] รับวัตถุเหตุการณ์
ดังนั้น getEvent ของเราจึงสามารถเพิ่มประสิทธิภาพได้ (อ้างอิงถึงเมธอด getEvent ใน event/event-debug.js ใน yui_2.7.0b):
ฟังก์ชั่น getEvent (เหตุการณ์) {
var ev = เหตุการณ์ ||. window.event;
ถ้า (!ev) {
var c = this.getEvent.caller;
ในขณะที่ (ค) {
ev = c.อาร์กิวเมนต์ [0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { /หมายเหตุของ Yi Fei: BUG ซอร์สโค้ด YUI, ev.constructor อาจเป็น MouseEvent ก็ได้ ไม่จำเป็นต้องเป็นเหตุการณ์
หยุดพัก;
-
c = c.ผู้โทร;
-
-
กลับ ev;
-
แน่นอนว่ามีวิธีแก้ไขที่ง่ายมาก ซึ่งก็คือการส่งพารามิเตอร์ไปที่ onclick="foo()" ด้วยตนเอง:
<button id="btn" onclick="foo(event)">ปุ่ม</button>