如何防止行为附加功能被附加两次?


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加载的部分中。如果我重新加载表单的该部分,则单击它们将弹出两次确认窗口。现在,我知道可以连续调用内部函数了,但是我希望确保仅一次将它添加到我的元素中,因此只能调用一次。我怎样才能做到这一点?

Answers:


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的时刻之一。我问过要防止两次,要防止多次。如果我问关于做一次 ...
Mołot

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选择匹配的元素上的标记,因此下次调用时将忽略它们。如果出于不同的目的多次调用一次函数,请不要使用同一字符串,否则可能会破坏其目的。


谢谢您的解释:)接受Clive的回答,因为他的代码直接为我工作,而您的代码却没有,但我更喜欢您的描述。
Mołot

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
Vadim Sudarikov

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

这对我
有用吗

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.