Làm thế nào để ngăn chặn các chức năng gắn liền với hành vi được gắn hai lần?


11

Tôi có một hành vi thêm onvào một số hộp kiểm.

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

Nó hoạt động rất tốt, nhưng các hộp kiểm nằm trong phần được tải AJAX. Nếu tôi tải lại phần đó của biểu mẫu, nhấp vào chúng sẽ bật lên xác nhận hai lần. Bây giờ, tôi biết tôi có thể kiểm tra chức năng bên trong nếu đó là lần đầu tiên liên tiếp được gọi, nhưng tôi muốn đảm bảo rằng nó chỉ được thêm vào phần tử của tôi một lần và do đó chỉ được gọi một lần. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


20

Các once()chức năng sẽ giúp với điều đó, ví dụ như

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

Một trong nhiều tài liệu tham khảo


2
Cảm ơn. Làm việc như người ở. Tôi đoán đó là một trong những khoảnh khắc khi tôi đơn giản là không hỏi Google đúng cách. Tôi hỏi về việc ngăn chặn hai lầnngăn chặn nhiều . Giá như tôi đã hỏi về việc thực hiện nó một lần ...
Mołot

1
@ Mołot Nhưng nhờ bình luận của bạn được lập chỉ mục, tôi đã tìm thấy nó khi tôi tìm kiếm để ngăn chặn nhiều :-D
frazras

7

Bạn cần sử dụng hàm once () để đạt được điều này. Từ trang này

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

Chuỗi "myModule" được truyền cho hàm được đặt làm điểm đánh dấu trên các phần tử khớp với lựa chọn jQuery, vì vậy lần sau khi được gọi, nó sẽ bỏ qua chúng. Không sử dụng cùng một chuỗi nếu bạn gọi hàm một lần nhiều lần cho các mục đích khác nhau, nếu không bạn có thể đánh bại mục đích của nó.


Cảm ơn bạn đã giải thích :) Câu trả lời được chấp nhận của Clive vì mã của anh ấy làm việc trực tiếp với tôi và bạn thì không, nhưng tôi thích mô tả của bạn hơn.
Mołot

0

bạn cũng có thể làm điều này:

(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

Đây là một ví dụ mở rộng trên frazras trả lời:

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.
    }
  }
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.