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


9

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?

Yanıtlar:


5

Drupal 7 tarafından kullanılan JavaScript kodu şöyledir:

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()ikinci parametre olarak kullanılan işleve, ilk parametre olarak geçirilen diziye eklendikleri sırayla aktarılır.
Bu, eklenen ilk davranışın Drupal.behaviorsö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 kullanıyorsanız, drupal_add_js ()bir ağırlığın JavaScript koduyla ilişkilendirilmesine izin verir; HTML çıktısında önce daha hafif bir JavaScript kodu görünür. Drupal 6 ile bu mümkün değil, diye düşündü.

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.


Bir keresinde bazı modüller tarafından kullanılan ağırlığı listeleyen bir sayfa buldum. Bu sayfanın URL'sini hatırlamıyorum ve sayfa yalnızca belirli modülleri içeriyorsa veya kapsamlıysa. Bu sayfayı bulursam, bağlantıyı burada bildireceğim.
kiamlaluno

1
Her zaman sadece sistem tablosunu kontrol edebilirsiniz - deneyinselect name, weight from system where type = 'module' order by weight ASC, name
cam8001 16

Ne yazık ki diğer modülün (vertical_tabs) PHP önce çalıştırmak için benim modülün PHP (mymodule) gerekir, ama vertical_tab'ın js sonra çalıştırmak için mymodule JS . Ağırlık davranışları için tamamen javascript tabanlı bir yol var mı?
cam8001

@ cam8001: Bunu biliyorum, ancak bu, bir modül tarafından kullanılan daha hafif ağırlığı bilmek için tüm modülleri takmanız gerektiği anlamına gelir. Bulduğum sayfa modül ağırlıklarını listeledi ve her modülden önce modülünüze hangi ağırlığı atamanız gerektiğini bilmeniz gerektiğinde yararlı olabilir. Biliyorum, sadece son derece hafif bir ağırlık kullanabilirsiniz, ancak gerekenden daha hafif bir ağırlık kullanırsınız.
kiamlaluno

@ cam8001: Bu durumda, içerdiği nesnelerin sırasını değiştirmek dışında ne yapmaya çalıştığınızı başarmanın bir yolu yoktur Drupal.behaviors; rapor ettiğim gibi $.each(Drupal.behaviors)nesneleri tanımlayıcılarına dayanarak eklendikleri sırada listeler.
kiamlaluno

5

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 eklemeye izin verir ve daha sonra drupal.attachBehaviors, ağırlıklara saygı duyan özel bir uygulama ile ele geçirir / değiştirir .


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).

Bkz
. Bir javascript nesnesindeki alanların sırası, bunlar arasında döngü yaparken öngörülebilir mi? ve
javascript'teki (… in…) döngüsü için Elements order - .


@kiam, Bunu drupal.org'da bir modül "davranış ağırlığı" ("bewgt") yaparsam, ortak yardımcı olarak katılır mıydınız? Muhtemelen oldukça küçük bir modül olacak, ancak muhtemelen başka bir şeyle gönderilmesine izin vermekten daha iyi olacak. Yerel olarak D6 için örnek bir uygulama var, işe yarıyor gibi görünüyor.
donquixote

just done it .. hala davetlisiniz :)
donquixote


İlginç bir modül olurdu, ama ilk önce bazı modüllerimin kodunu güncellemeliyim, bunun için çağlardan bir kod satırı yazmadım. Bundan sonra, yeni bir modülü birlikte geliştirmekte özgür olabilirim.
kiamlaluno

Sadece söylemek gerekirse, insanlar kullanım örnekleri istiyorlar. drupal.org/node/1302126#comment-5911632
donquixote

0

Drupal 6 için -

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.

Taşınabilir olması gerekiyorsa, drupal 6'daki "en temiz" çözüm, php ile modülünüzden farklı ağırlıkta yeni bir modül eklemektir. İki modülü aynı klasörde bile alabilir, ilk modülü birincisine bağımlı hale getirebilir ve yükleme / güncelleme kancalarındaki ağırlıkları ayarlayabilirsiniz. Bunlardan hiçbiri gerekli değildir, sadece kurulumu kolaylaştırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.