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


9

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ì?

Câu trả lời:


5

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ự mà chúng được thêm vào, thì các giá trị sẽ được truyền từ jQuery.each()hàm được sử dụng làm tham số thứ hai theo thứ tự chúng được chèn trong 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 thi trước.
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. Điều này là 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.


Tôi đã từng tìm thấy một trang liệt kê trọng lượng được sử dụng bởi một số mô-đun. Tôi không nhớ URL của trang đó và nếu trang chỉ bao gồm các mô-đun cụ thể, hoặc nó là toàn diện. Nếu tôi tìm thấy trang đó, tôi sẽ báo cáo ở đây liên kết.
kiamlaluno

1
Bạn luôn có thể chỉ cần kiểm tra trong bảng hệ thống - thửselect name, weight from system where type = 'module' order by weight ASC, name
cam8001

Thật không may, tôi cần PHP (mymodule) của mô-đun của tôi để chạy trước PHP của mô-đun khác (vertical_tabs), nhưng JS của mymodule để chạy sau js của vertical_tab. Có một cách thuần túy dựa trên javascript để hành vi trọng lượng?
cam8001

@ cam8001: Tôi biết điều đó, nhưng điều đó có nghĩa là bạn nên cài đặt tất cả các mô-đun, để biết trọng lượng nhẹ hơn được sử dụng bởi một mô-đun. Trang tôi tìm thấy đã liệt kê các trọng số mô-đun và nó có thể hữu ích khi bạn cần biết trọng lượng nào bạn nên gán cho mô-đun của mình để được thực hiện trước mỗi mô-đun. Tôi biết, bạn chỉ có thể sử dụng một trọng lượng cực kỳ nhẹ, nhưng bạn sẽ sử dụng một trọng lượng nhẹ hơn mức cần thiết.
kiamlaluno

@ cam8001: Trong trường hợp đó, không có cách nào để thực hiện những gì bạn đang cố gắng làm, ngoại trừ thay đổi thứ tự của các đối tượng có trong Drupal.behaviors; như tôi đã báo cáo $.each(Drupal.behaviors)liệt kê các đối tượng theo cùng thứ tự chúng được chèn, không dựa trên định danh của chúng.
kiamlaluno

5

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 số với các hành vi, và sau đó nó chiếm quyền điều khiển / thay thế drupal.attachBehaviorsbằng cách thực hiện tùy chỉnh, 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 một đối tượng javascript có thể dự đoán được khi lặp qua chúng không?
thứ tự các yếu tố - vòng lặp (cho trong lỗi) trong javascript .


@kiam, Nếu tôi biến mô-đun này thành "trọng lượng hành vi" ("bewgt") trên drupal.org, bạn có tham gia với tư cách là người đồng bảo trì không? Nó có thể sẽ là một mô-đun nhỏ, nhưng có lẽ tốt hơn là để nó được vận chuyển với một cái gì đó khác. Tôi có một triển khai mẫu tại địa phương cho D6, dường như hoạt động.
donquixote

chỉ cần thực hiện nó .. bạn vẫn được mời :)
donquixote

drupal.org/node/1302126 - Tôi hy vọng điều này sẽ là cốt lõi trong D8 :)
donquixote

Nó sẽ là một mô-đun thú vị, nhưng trước tiên tôi phải cập nhật mã của một số mô-đun mà tôi đã không viết một dòng mã từ nhiều thời đại. Sau đó, tôi có thể tự do phát triển một mô-đun mới.
kiamlaluno

Chỉ cần nói, mọi người đang yêu cầu sử dụng trường hợp. drupal.org/node/1302126#comment-5911632
donquixote

0

Đối 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. Bạn thậm chí 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ó cái nào là cần thiết, chỉ làm cho việc cài đặt dễ dàng hơn.

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.