it-swarm.asia

كيف يمكنني التحكم في ترتيب Drupal.behaviors؟

أريد تشغيل رمز JavaScript من الوحدة النمطية X فقط بعد تشغيل الرمز من الوحدة النمطية Y. ما هي الطريقة الأفضل لعمل هذا؟

9
cam8001

كود JavaScript المستخدم بواسطة Drupal 7 هو التالي:

Drupal.attachBehaviors = function (context, settings) {
  context = context || document;
  settings = settings || Drupal.settings;
  // Execute all of them.
  $.each(Drupal.behaviors, function () {
    if ($.isFunction(this.attach)) {
      this.attach(context, settings);
    }
  });
};

يستخدم Drupal 6 رمزًا مشابهًا:

Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

إذا كانت جافا سكريبت تضمن أن خصائص الكائن/المصفوفة يتم اجتيازها دائمًا بنفس الترتيب الذي تتم إضافتها فيه ، فسيتم تمرير القيم من jQuery.each() إلى الدالة المستخدمة كمعلمة ثانية بنفس الترتيب الذي يتم إدراجها فيه تمرير الصفيف كمعلمة الأولى.
هذا يعني أن السلوك الأول المدرج في Drupal.behaviors يتم تنفيذه أولاً.
في هذه الحالة ، للسماح بتنفيذ السلوكيات المحددة بواسطة الوحدة النمطية الخاصة بك أولاً ، يمكنك استخدام وزن أخف لها. إذا كنت تريد تنفيذها قبل الأخرى ، فيجب ضبط وزن الوحدة على -50 ؛ يمكن أن تعمل القيم الأخرى أيضًا. إذا كنت تستخدم Drupal 7، drupal_add_js () يسمح بربط الوزن بكود JavaScript ؛ يظهر كود JavaScript مع وزن أخف أولاً في إخراج HTML. هذا غير ممكن مع Drupal 6 ، الفكر.

لا تضمن جافا سكريبت أن يتم اجتياز الخصائص بنفس الترتيب الذي تتم إضافتها فيه. هذا يعني أن تطبيقات JavaScript المختلفة ستقدم نفس الخصائص باستخدام ترتيب مختلف ؛ هذا يعني أيضًا أن الترتيب نفسه يمكن أن يتغير في إصدارات مختلفة من نفس المتصفح.

5
kiamlaluno

استخدم أوزان السلوك الوحدة النمطية.
(يرجى إختباره قبل استخدامه على موقع الإنتاج)

تسمح الوحدة بإرفاق الأوزان بالسلوكيات ، ثم تقوم باختطاف/استبدال drupal.attachBehaviors مع تنفيذ مخصص يحترم الأوزان.


لماذا لا وزن الوحدة بدلا من ذلك ، كما هو مقترح في الإجابة الأخرى؟

  • وحدة الوزن هي أداة ثقيلة جدا. ينطبق على جميع تطبيقات هوك (php) والسلوكيات (js) للوحدة ، بينما نحن مهتمون فقط بسلوك واحد.
  • لا تضمن المواصفات ترتيب الخصائص في كائن js (على الرغم من أنه يتم تنفيذه بالشكل الذي تتوقعه في جميع المتصفحات تقريبًا).

نرى
هل ترتيب الحقول في كائن جافا سكريبت يمكن التنبؤ به عند التكرار خلالها؟ و
ترتيب العناصر - لحلقة (... in…) في جافا سكريبت .

5
donquixote

ل Drupal 6 -

الحل البسيط ، إذا لم يكن هناك حاجة إلى أن يكون محمولًا هو وضع JS الذي تريد تشغيله أخيرًا في ملف theme.php theme. يتم استدعاء مكالمات موضوع drupal_add_js دائمًا بعد الوحدات النمطية.

إذا كان بحاجة إلى أن يكون محمولًا ، فإن الحل "الأنظف" في drupal 6 هو إضافة وحدة جديدة لها وزن مختلف عن وحدتك مع php. يمكنك حتى الحصول على الوحدتين في نفس المجلد ، اجعل الوحدة الأولى تعتمد على الوحدة الأولى ، واضبط الأوزان في خطافات التثبيت/التحديث. ولا يلزم أي منها ، مما يجعل التثبيت أسهل.

0
mirzu