it-swarm-vi.com

Làm cách nào tôi có thể kiểm soát thứ tự của Drupal.behaviors?

Tôi muốn mã JavaScript từ mô-đun X chỉ chạy sau khi mã từ mô-đun Y chạy. Cách tốt nhất để làm điều này là gì?

9
cam8001

Mã JavaScript được sử dụng bởi Drupal 7 như sau:

Drupal.attachBehaviors = function (context, settings) {
  context = context || document;
  settings = settings || Drupal.settings;
  // Execute all of them.
  $.each(Drupal.behaviors, function () {
    if ($.isFunction(this.attach)) {
      this.attach(context, settings);
    }
  });
};

Drupal 6 sử dụng mã tương tự:

Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

Nếu JavaScript sẽ đảm bảo rằng các thuộc tính đối tượng/mảng luôn được dịch chuyển theo cùng thứ tự chúng được thêm vào, thì các giá trị sẽ được truyền từ jQuery.each() đến hàm được sử dụng làm tham số thứ hai theo thứ tự chúng được chèn vào mảng được truyền dưới dạng tham số đầu tiên.
[.__.] Điều này có nghĩa là hành vi đầu tiên được chèn vào Drupal.behaviors Được thực hiện trước tiên.
[.___.] Trong trường hợp này, để cho phép các hành vi được xác định bởi mô-đun của bạn được thực thi trước tiên, bạn có thể sử dụng trọng lượng nhẹ hơn cho nó. Nếu bạn muốn chúng được thực thi trước các cái khác, trọng lượng mô-đun nên được đặt thành -50; các giá trị khác cũng có thể hoạt động. Nếu bạn đang sử dụng Drupal 7, drupal_add_js () cho phép liên kết trọng số với mã JavaScript; Mã JavaScript với trọng lượng nhẹ hơn xuất hiện đầu tiên trong đầu ra HTML. không thể với Drupal 6, đã nghĩ.

JavaScript không đảm bảo rằng các thuộc tính được duyệt theo cùng thứ tự chúng được thêm vào. Điều này có nghĩa là các triển khai JavaScript khác nhau sẽ trình bày các thuộc tính giống nhau bằng cách sử dụng một thứ tự khác nhau; điều đó cũng có nghĩa là cùng một thứ tự có thể thay đổi trong các phiên bản khác nhau của cùng một trình duyệt.

5
kiamlaluno

Sử dụng mô đun Trọng lượng hành vi .
[.__.] (Vui lòng thử nghiệm trước khi sử dụng trên trang sản xuất)

Mô-đun cho phép gắn trọng lượng vào các hành vi và sau đó nó chiếm quyền điều khiển/thay thế drupal.attachBehaviors với việc thực hiện tùy chỉnh, điều đó tôn trọng các trọng số.


Tại sao không phải là trọng lượng mô-đun thay thế, như đề xuất trong câu trả lời khác?

  • trọng lượng mô-đun là một công cụ khá nặng. Nó áp dụng cho tất cả các cài đặt hook (php) và hành vi (js) của mô-đun, trong khi chúng tôi chỉ quan tâm đến một hành vi duy nhất.
  • thứ tự của các thuộc tính trong một đối tượng js không được đảm bảo bởi thông số kỹ thuật (mặc dù nó được triển khai như bạn mong đợi trong hầu hết các trình duyệt).

Xem
[.__.] Thứ tự của các trường trong đối tượng javascript có thể dự đoán được khi lặp qua chúng không?
[.__.] Thứ tự các thành phần - vòng lặp (cho trong lỗi) trong javascript .

5
donquixote

Với Drupal 6 -

Một giải pháp đơn giản, nếu điều này không cần phải di động là đặt mã JS bạn muốn chạy cuối cùng vào tệp template.php. Các cuộc gọi drupal_add_js chủ đề luôn được gọi sau các mô-đun.

Nếu nó cần phải di động, giải pháp "sạch nhất" trong drupal 6 là thêm một mô-đun mới có trọng lượng khác với mô-đun của bạn bằng php. Thậm chí bạn có thể có hai mô-đun trong cùng một thư mục, làm cho mô-đun đầu tiên phụ thuộc vào đầu tiên và điều chỉnh các trọng số trong các móc cài đặt/cập nhật. Không cần thiết, chỉ cần cài đặt dễ dàng hơn.

0
mirzu