動作に関連付けられた関数が2回アタッチされないようにするにはどうすればよいですか?


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ロードされた部分にあります。フォームのその部分をリロードした場合、それらをクリックすると確認ポップアップが2回表示されます。これで、関数内で初めて呼び出された場合に関数内をテストできることはわかっていますが、それが要素に追加されるのは1度だけにして、1度だけ呼び出すようにすることをお勧めします。どうやってやるの?

回答:


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

多くの参照の1つ


2
ありがとう。魅力のように働いた。これは、Googleに適切に尋ねることができなかった瞬間の1つだと思います。私はについて尋ね二度防止及び複数のを防ぎます。私はそれをやっについて尋ねてきた場合にのみ、一度 ...
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の選択に一致する要素のマーカーとして設定されるため、次回一度呼び出されたときに無視されます。異なる目的でonce関数を複数回呼び出す場合は、同じ文字列を使用しないでください。同じ文字列を使用すると、目的が無効になる可能性があります。


あなたの説明をありがとう:)彼のコードは私のために直接働き、あなたはうまくいかなかったのでクライブの答えを受け入れました、しかし私はあなたの説明をより好きです。
Mołot

1

これは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()コンテキストがaになるとき、関数は1回だけ実行されますdocument
Vadim Sudarikov

0

これも行うことができます:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.