Як запобігти двічі приєднувати функції, пов'язані з поведінкою?


11

У мене поведінка, яка додає onдо деяких прапорців.

(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);

Він працює дуже добре, але прапорці знаходяться в завантаженій AJAX частині. Якщо я перезавантажую цю частину форми, натискання на них двічі підтверджує. Тепер я знаю, що я можу перевірити внутрішню функцію, якщо вона вперше поспіль викликається, але я вважаю за краще переконатися, що вона додається до мого елемента лише один раз, і таким чином викликається лише один раз. Як я можу це зробити?

Відповіді:


20

once()Функція допоможе з цим, наприклад ,

(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);

Одна з багатьох посилань


2
Дякую. Працював як шарм. Я думаю, що це один із таких моментів, коли я просто не можу запитати Google належним чином. Я запитав про запобігання двічі та запобігання кратності . Якби я лише попросив зробити це один раз ...
Молот

1
@ Mołot Але, завдяки тому, що ваш коментар проіндексується, я виявив його, коли шукав запобігати множині :-D
frazras

7

Для цього вам потрібно використовувати функцію Once (). З цієї сторінки

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

Рядок "myModule", переданий функції, встановлюється як маркер для елементів, що відповідають вибору jQuery, тому наступного разу, коли буде викликаний, ігнорує їх. Не використовуйте один і той же рядок, якщо ви викликаєте функцію одного разу кілька разів для різних цілей, інакше ви можете перемогти її призначення.


Дякую за ваше пояснення :) Прийняв відповідь Клайва, оскільки його код працював на мене безпосередньо, а ваш - ні, але мені більше подобається ваш опис.
Молот

2

Ось приклад, який розширюється на відповідь frazras:

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.
    }
  }
};

Це рішення спрацювало на мене. Мені не потрібно пов’язувати якийсь елемент з дією. Я повинен запускати лише функцію. Drupal.behaviors.checkOnce = { attach: function (context, settings) { if (context === document) { check(); } function check() { //code } } };У цьому випадку check()функція запуститься лише один раз, коли контекст будеdocument
Вадим Сударіков

1

Ви також можете це зробити:

(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);


0

ось ще один спосіб функціонування, який запускається один раз:

(function($, Drupal) {

  var initialized;

  function init() {
    if (!initialized) {
      initialized = true;
      // Add your one-time only code here
    }
  }

  Drupal.behaviors.someKey = {
    attach: function() {
      init();
    }
  };

}(jQuery, Drupal));

Джерело: https://www.drupal.org/forum/support/module-development-and-code-questions/2018-06-15/run-js-funtion-once-not-attach-once#comment-12654121

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.