عادةً ما نكتب كائن الحدث على النحو التالي:
وظيفة 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();
تنبيه (ه)؛}
</script>
نتيجة التشغيل غير محددة في Firefox، لماذا؟
المكالمة في Firefox هي في الواقع مثل هذا الاستدعاء الأول الذي سيتم تنفيذه هو:
وظيفة عند النقر (الحدث) {
foo();
}
ثم يتم تنفيذ المكالمة:
وظيفة فو () {
var e = getEvent();
تنبيه (ه)؛
}
ستجد أن foo() في onclick="foo()" ضمن Firefox لا يمكنه تمرير معلمات كائن الحدث تلقائيًا، ولكن يتم تمريره إلى وظيفة onclick التي أنشأها النظام افتراضيًا. في هذا المثال، يمكننا تمرير getEvent.caller .caller.arguments[ 0] احصل على كائن الحدث.
لذلك، يمكن تحسين getEvent الخاص بنا (راجع طريقة getEvent في events/event-debug.js في yui_2.7.0b):
وظيفة getEvent(الحدث) {
فار ev = حدث ||.
إذا (! إيف) {
var c = this.getEvent.caller;
بينما (ج) {
ev = c.arguments[0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { / ملاحظة Yi Fei: خطأ في كود مصدر YUI، قد يكون ev.constructor أيضًا MouseEvent، وليس بالضرورة حدثًا
استراحة؛
}
ج = ج.المتصل؛
}
}
عودة إيف؛
}
بالطبع، هناك حل بسيط للغاية، وهو تمرير المعلمات يدويًا إلى onclick="foo()":
<button id="btn" onclick="foo(event)">زر</button>