web-gelistirme-sc.com

Drupal.behaviors sırasını nasıl kontrol edebilirim?

X modülünden JavaScript kodunun yalnızca Y modülünden çalıştırıldıktan sonra çalışmasını istiyorum. Bunu yapmanın en iyi yolu nedir?

9
cam8001

Drupal 7 tarafından kullanılan JavaScript kodu şudur:

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 benzer kodu kullanır:

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

JavaScript, nesne/dizi özelliklerinin her zaman eklendikleri sırayla geçilmesini garanti ederse, değerler jQuery.each() öğesinden, eklendikleri sırayla ikinci parametresi olarak kullanılan işleve geçirilir. dizi ilk parametre olarak geçti.
Bu, Drupal.behaviors İçine eklenen ilk davranışın ilk önce yürütüldüğü anlamına gelir.
Bu durumda, önce modülünüz tarafından tanımlanan davranışların yürütülmesine izin vermek için, bunun için daha hafif bir ağırlık kullanabilirsiniz. Bunların diğerinden önce yürütülmesini istiyorsanız, modül ağırlığı -50 olarak ayarlanmalıdır; diğer değerler de işe yarayabilir. Drupal 7, drupal_add_js () , JavaScript koduyla bir ağırlık ilişkilendirmenize izin verir; HTML çıktısında önce daha hafif bir JavaScript kodu görüntülenir. Drupal 6, düşünce ile mümkün değil.

JavaScript, özelliklerin eklendikleri sırayla geçiş yapıldığını garanti etmez. Bu, farklı JavaScript uygulamalarının aynı özellikleri farklı bir sipariş kullanarak sunacağı anlamına gelir; aynı siparişin aynı tarayıcının farklı sürümlerinde de değişebileceği anlamına gelir.

5
kiamlaluno

Davranış Ağırlıkları modülünü kullanın.
(Lütfen bir üretim sitesinde kullanmadan önce biraz test yapın)

Modül, davranışlara ağırlık eklenmesine izin verir ve daha sonra drupal.attachBehaviors ağırlıklara saygı özel bir uygulama ile.


Neden diğer cevapta önerildiği gibi modül ağırlığı?

  • modül ağırlığı oldukça ağır bir araçtır. Modülün tüm kanca uygulamaları (php) ve davranışları (js) için geçerlidir, sadece tek bir davranışla ilgileniyoruz.
  • bir js nesnesindeki özelliklerin sırası spec tarafından garanti edilmez (neredeyse tüm tarayıcılarda beklediğiniz gibi uygulanmış olmasına rağmen).

Görmek
Bir javascript nesnesindeki alanların döngüleri arasında geçiş sırasında öngörülebilir mi? ve
Öğeler sırası - javascript'teki (… in…) döngüsü için .

5
donquixote

Drupal 6 -

Taşınabilir olması gerekmiyorsa basit bir çözüm, en son çalıştırmak istediğiniz JS'yi theme template.php dosyasına koymaktır. Tema drupal_add_js çağrıları her zaman modüllerden sonra çağrılır.

Eğer taşınabilir olması gerekiyorsa drupal 6] içindeki "temiz" çözüm php ile modülünüzden farklı ağırlıkta yeni bir modül eklemektir. aynı klasörde, ilk modülü ilkine bağımlı hale getirin ve kurulum/güncelleme kancalarındaki ağırlıkları ayarlayın, bunlardan hiçbiri gerekli değildir, sadece kurulumu kolaylaştırır.

0
mirzu