سؤال

أعرف القليل جدًا عن جافا سكريبت ولكن على الرغم من ذلك أحاول تجميع شيء ما معًا في مدونتي على ووردبريس.إنها لا تعمل، ولا أعرف كيفية حلها، وهذا هو الغرض من StackOverflow، أليس كذلك؟

أولاً رسالة الخطأ هي:

Error: element.dispatchEvent is not a function
Source File: http://.../wp-includes/js/prototype.js?ver=1.6
Line: 3936

يحدث ذلك عند تحميل الصفحة.يتم تسجيل معالج تحميل صفحتي على النحو التالي:

Event.observe(window, 'load', show_dates_as_local_time);

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

ثانيًا، أنا أتبع ممارسات الاستخدام الموصى بها من WordPress wp_enqeue_script لإضافة تبعية من JavaScript إلى مكتبة النموذج الأولي، كما يلي:

add_action( 'wp_print_scripts', 'depo_theme_add_javascript' );

function depo_theme_add_javascript() {
    wp_enqueue_script('friendly_dates', 'javascript/friendly_dates.js', array('prototype'));
}

أدرك الآن أيضًا أن هناك بعض التعارضات المحتملة بين jQuery وPrototype والتي يتم حلها باستخدام jQuery noConflicts طريقة.لقد حاولت الاتصال بذلك من أماكن مختلفة ولكن ليس جيدًا.أنا لا يفكر هذه هي المشكلة لأن أ) noConflict الوظيفة تتعلق فقط بـ $ متغير، والذي لا يبدو أنه يمثل المشكلة هنا، و ب) سأفعل يتوقع وورد لفرزها بالنسبة لي لأنه يمكن...

أخيرًا، باستخدام مصحح أخطاء Venkman، حددت أن element المشار إليه في رسالة الخطأ هو بالفعل HTMLDocument ولكنها تفتقر أيضًا إلى أ dispatchEvent.لست متأكدًا من كيفية حدوث ذلك، نظرًا لأنها طريقة DOM قياسية؟

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

المحلول 4

وشكرا للاقتراحات الإطلاق. في النهاية أعتقد أن التفسير كينت الأقرب والتي بلغت في الأساس إلى "مكسورة النموذج". (آسف إذا أنا يلخص بشكل غير صحيح:)

وأما بالنسبة للخيار jQuery.noConflict - سبق أن أشرت إليها هذا في السؤال. انه يجعل هناك فارقا <م> عند تشغيل هذا الأسلوب، ولدي سيطرة قليلة جدا على ذلك. وكما قلت، لقد حاولت تشغيله في بضع أماكن مختلفة (على وجه التحديد رأس الصفحة وأيضا من ملف نصي)، ولكن دون تأثير. لذلك، بقدر ما كنا جميعا مثل أن يكون "مجرد استخدام noConflict" هو لا إجابة على هذا السؤال، على الأقل ليس من دون معلومات إضافية.

وعلاوة على ذلك، jQuery.noConflict <م> يبدو أن يكون حول متغير $، وقانون حول نقطة الخطأ لا تتعامل مع هذا المتغير على الإطلاق. بالطبع أنها يمكن أن تكون ذات صلة غير مباشرة، وأنا لم تعقب عليه.

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

نصائح أخرى

هناك خدعة سيئة تقوم بها العديد من المكتبات وقد أعجبتني بشكل واضح، ويبدو أن النموذج الأولي هو أحد هذه الحيل.

يقوم Mootools بهذا، إذا كنت على حق، ويتضمن التحميل الزائد للعديد من النماذج الأولية على الفئات الأساسية، وتصحيحها بالقرود.

وبالمثل ، واجهت بالمثل سلوكًا غريبًا عندما كان mootools و jQuery موجودين، وعادة ما يموت jQuery لأنه كان يستدعي بعض طرق الكائنات التي تم تحميلها بشكل زائد/تم تصحيحها بواسطة Mootools.

أيضًا، وبشكل غامض، أدى إخراج mootools من قائمة استخدام البرنامج النصي إلى كل شئ يعمل بشكل أسرع بكثير، والذي خلصت إلى أنه كان بسبب انخفاض تلوث الكائنات.

الآن قد أكون مخطئًا، لكنني استنتجت من تجربتي أن مثل هذه المكتبات ببساطة لا تحب التعايش مع بعضها البعض، ورؤية كيف بدا لي أن كود mootools يقلل من السرعة التي تتم بها الأشياء العادية، لقد امتصت و تم نقل جميع التعليمات البرمجية المستندة إلى mootools إلى jQuery (أؤكد لك أنها صفقة تستغرق وقتًا طويلاً)، وكانت النتيجة هي الكود الذي تم سريع و لم تكن بها أخطاء غريبة لا يمكن تفسيرها.

أنصحك بالتفكير في الهجرة على الأقل واحد من خياراتك.

شيء آخر، عند الكتابة:

أميل إلى استخدام بناء الجملة هذا مع كل التعليمات البرمجية التي تعتمدها jQuery، للحصول على القليل من التغليف الآمن في حالة قيام شخص ما بكسر '$' بطريقة ما.

رمز وقت التشغيل ينتظر هذا document.ready قبل التنفيذ:

 jQuery(function($){ 
      code_with_$_here; 
 }); 

الإضافات مسج

(function($){ 
    code_with_$_here; 
})(jQuery); 

استخدام هذه سوف يسهل على الناس استخدام أي jQuery تكتبه لتتمكن من استخدامه دون الكثير من مشاكل التعارض.

سيتركهم هذا في الأساس للتأكد من أن الكود الخاص بهم لا يفعل أي شيء سحري حقًا.

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

jQuery.noConflict();

ولكن مرة أخرى، وأعتقد أنه لا معنى لتحميل أكثر من 15-20kb لكل مكتبة:)

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