Davranışa bağlı işlevlerin iki kez eklenmesini nasıl önleyebilirim?


11

onBazı onay kutularına ekleyen bir davranış var .

(function($) { 
  Drupal.behaviors.mymodule = {
    attach: function (context, settings) {

      $('.skip-line', context).on('change', function(){
        // some code
        if ( confirm(Drupal.t('Apply to all languages?')) ) {
          // applying...
        }
      });
    }
  };
})(jQuery);

Çok iyi çalışıyor, ancak onay kutuları AJAX yüklü kısımda. Formun bu bölümünü yeniden yüklersem, üzerlerine tıklamak onay penceresini iki kez yapar. Şimdi, bir satırda ilk kez çağrılırsa fonksiyonun içinde test edebileceğimi biliyorum, ancak öğeme yalnızca bir kez eklendiğinden ve böylece yalnızca bir kez çağrıldığından emin olmayı tercih ederim. Bunu nasıl yapabilirim?

Yanıtlar:


20

once()Fonksiyonu olduğunu, örneğin yardımcı olacaktır

(function($) { 
   Drupal.behaviors.mymodule = {
    attach: function (context, settings) {

      $('.skip-line', context).once('mymodule').on('change', function(){
        // some code
        if ( confirm(Drupal.t('Apply to all languages?')) ) {
          // applying...
        }
      });
    }
  };
})(jQuery);

Birçok referanstan biri


2
Teşekkürler. Bir cazibe gibi çalıştı. Sanırım Google'a düzgün bir şekilde sormadığım zaman bu anlardan biri. Ben iki kez önleme ve birden çok önleme hakkında sordu . Sadece bir kez
yapmamı istesem

1
@ Mołot Ama yorum indeksli sayesinde, ben birden önlemek için arama yaparken buldum:
D

7

Bunu başarmak için once () işlevini kullanmanız gerekir. Gönderen bu sayfada

Drupal.behaviors.myModule = {
  attach: function (context, settings) {
    $('element', context).once('myModule', function () {
     // any behavior is now applied once
    });
  }
};

İşleve geçirilen "myModule" dizesi, jQuery seçimiyle eşleşen öğeler üzerinde bir işaretçi olarak ayarlanır, bu nedenle bir dahaki sefere çağrıldığında bunları yok sayar. Bir kez işlevini farklı amaçlar için birden çok kez çağırırsanız aynı dizeyi kullanmayın, aksi takdirde amacını yenebilirsiniz.


Açıklamanız için teşekkür ederiz :) Kodunun benim için doğrudan çalıştığı ve yapmadığınız için Clive'nin cevabını kabul etti, ancak açıklamanızı daha iyi beğendim.
Mołot

2

Frazras cevabı üzerine genişleyen bir örnek:

var searchPagesFoundationAccordionInit = false;
Drupal.behaviors.searchPagesFoundationAccordionInit = {
  attach: function (context, settings) {
    // Attempt to resolve behavior being called multiple times per page load.
    if (context !== document) {
      return;
    }
    if (!searchPagesFoundationAccordionInit) {
      searchPagesFoundationAccordionInit = true;
    }
    else {
      return;
    }

    // Check if component exists.
    if ($('.view-style--search-page .search-section__sidebar .accordion').length > 0) {
     // Code here.
    }
  }
};

Bu çözüm benim için çalıştı. Bazı unsurları aksiyonla ilişkilendirmem gerekmiyor. Sadece bir işlev yürütmeliyim. Drupal.behaviors.checkOnce = { attach: function (context, settings) { if (context === document) { check(); } function check() { //code } } };Bu durumda, check()bağlam bir document
olacaksa

1

bunu da yapabilirsiniz:

(function ($, Drupal, drupalSettings) {
    'use strict';
Drupal.behaviors.someThing = {
        attach: function (context) {
            if (context === document) {
               console.log('called inside'); // Once <-- 
            }
            console.log('called outside'); // can be manny manny  <-- 
         },
    };
})(jQuery, Drupal, drupalSettings);

Harika bu benim için çalışıyor
Mahtab Alam

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.