سؤال

مشكلة متخصصة جدًا:

أحيانًا (30٪ من الوقت) أحصل على خطأ جافا سكريبت "معالج غير محدد" في السطر 3877 من مكتبة Prototype.js (الإصدار 1.6.0.2 من google: http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js).

لدي الآن في هذه الصفحة خريطة Google وأستخدم مكتبة Prototype Window.

المشكلة تحدث في IE7 وFF3.

هذه هي المعلومات التي يقدمها FireBug:

handler is undefined
? in prototype.js@3871()prototype.js (line 3877)
handler.call(element, event);

لقد قمت بالتبديل إلى إصدار محلي من Prototypejs وأضفت بعض تصحيح الأخطاء في الطريقة المخالفة (createWraper) لكن تصحيح الأخطاء لم يظهر أبدًا قبل ظهور الخطأ...

لقد بحثت في Google ووجدت إشارة أخرى للخطأ في نفس السطر، ولكن لا توجد إجابة لذلك أقوم بنشرها هنا حيث ربما، في يوم من الأيام سيكون لدى شخص ما إجابة :).

هل كانت مفيدة؟

المحلول

لقد اكتشفت للتو أن هذا الخطأ يحدث أيضًا إذا تركت عن طريق الخطأ القوسين في مكالمة المراقب الخاصة بك:

Event.observe(document, 'myapp:application_ready', myapp.MyClass.initApp());

بدلاً من

Event.observe(document, 'myapp:application_ready', myapp.MyClass.initApp);

نصائح أخرى

من المحتمل أن يتسبب هذا في حدوث خطأ:

Event.observe(myElement, 'click', myFunction(myParameters));

يجب عليك أن تفعل ذلك مثل هذا بدلا من ذلك:

Event.observe(myElement, 'click', function() { myFunction(myParameters) });

لقد تحولت إلى إصدار محلي من النموذج الأولي وأضفت بعض تصحيح الأخطاء في طريقة المخالفة (CreateWeraper) ولكن تصحيح الأخطاء لا يظهر قبل الخطأ ...

في الواقع، الوظيفة المخالفة التي يتم استدعاؤها عند حدوث الخطأ هي "المجمع" الذي يتم إنشاؤه داخل createWrapper (ولكن لا يتم استدعاؤه هناك).ما يحدث أساسًا هو أنك قمت بإرفاق وظيفة كمعالج الحدث لعنصر ما، والدالة غير موجودة بالفعل.

إذا كنت تحاول وضع أي معلومات تصحيح لمحاولة تحديد الوظيفة "غير الموجودة"، فقم بإضافة رسائل التنبيه أو مخرجات وحدة التحكم في Firebug داخل وظيفة التغليف بين السطرين 3871 و3878.

حل بسيط حقا ل "معالج غير محدد" من Prototype.js الخطأ في النموذج الأولي هو فقط ...إصلاح النموذج الأولي.وجدت نصيحة هنا: https://prototype.lighthouseapp.com/projects/8886/tickets/407-ie7-i8-report-handler-is-null-or-not-an-object وهي تعمل بالفعل.

فقط ابحث عن السطر مع:handler.call(element, event); واستبدال بif (handler) handler.call(element, event)تم حل المشكلة باستخدام النموذج الأولي 1.6.0.3 والأحدث :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top