동작 첨부 기능이 두 번 첨부되는 것을 방지하는 방법은 무엇입니까?


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에 제대로 요청하지 않는 순간이었던 것 같습니다. 나는 대해 질문을 두 번 방지배수를 방지 . 내가 한 번만 물어 보면 ...
Mołot

1
Mołot 그러나 귀하의 의견 덕분에 @ I 방지 여러 :-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의 답변이 Clive의 답변을 수락했지만 귀하의 설명은 더 좋지 않습니다.
Mołot

2

frazras answer에서 확장되는 예는 다음과 같습니다.

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

위대한이 나를 위해 작동
Mahtab 알람

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.