2010-10-15 30 views
53
  • Hành vi của Drupal là gì?
  • Loại lớp dịch vụ nào cung cấp cho nhà phát triển mô-đun?
  • Loại quan hệ nào được ánh xạ tới jQuery.ready?
+1

@JoshiConsultancy Nói chung, ứng phó hiệu quả trên stackoverflow bao gồm một câu trả lời trực tiếp ** ** bao gồm các liên kết đến các trích dẫn và tham khảo. Hầu hết mọi người xem trang này ** đã truy cập tại đây bằng cách tìm kiếm ** để bắt đầu. – dreftymac

Trả lời

75

Long phiên bản: Drupal.behaviors không chỉ đơn giản là một sự thay thế cho jQuery.ready kể từ sau chỉ chạy một lần (khi DOM đã sẵn sàng cho các thao tác): hành vi có thể bị sa thải nhiều lần trong quá trình thực trang và có thể chạy bất cứ khi nào các phần tử DOM mới được chèn vào tài liệu.

Ngoài ra, mô-đun có thể ghi đè hoặc mở rộng hành vi hiện tại (ví dụ: nếu một mô-đun có hành vi thêm hiệu ứng thoát trên tất cả các liên kết, mô-đun thứ hai có thể thay thế hành vi bằng hiệu ứng thoát khác).

Phiên bản ngắn: có nhiều mô-đun hơn mặc dù tài liệu có thể được cải thiện.


Ngoài ra, bắt đầu trong Drupal 7, cài đặt được xác định bằng drupal_add_js (PHP) hoặc trong Drupal.settings.modulename (Javascript) được truyền trực tiếp như tham số thứ hai (một trong những đầu tiên là ngữ cảnh) để hành vi.

Ví dụ:

Drupal.behaviors.changeLinks = function(context, settings){ 
    if (!settings) settings = Drupal.settings.changeLinks; 
    $("a", context).hover(function() { 
     $(this).css('color', settings.color); 
    }); 
}; 

Và nếu một trong những kịch bản của bạn (hoặc khác) tạo ra các nút mới, nó vẫn có thể có những hành vi áp dụng cho các nút mới mà không cần phải biết những gì các module khác được iinstalled:

var newNodes = $('<a href="#">Hello</a> <a href="#">World</a>').appendTo('#someDiv'); 

Drupal.attachBehaviors(newNodes); 
+0

Chỉ cần lưu ý rằng bạn cần phải bọc bất kỳ việc sử dụng $() nào bên trong (hàm ($) {// mã tại đây}) (jQuery); (Với các phiên bản hiện tại của Drupal 7) Tài liệu chính thức về nó ở đây: https://www.drupal.org/node/756722#using-jquery –

+0

Điểm của bối cảnh truyền đạt ở đây là gì? – AlxVallejo

+0

Ngữ cảnh là đoạn từ DOM đã được sửa đổi. Ban đầu, nó là toàn bộ tài liệu. Nhưng đối với tất cả các cuộc gọi tiếp theo, nó sẽ chỉ là phần mới được thêm vào hoặc sửa đổi. Ví dụ: nếu bạn sử dụng thư viện Hộp đèn để mở nội dung mới trong Hộp đèn thì bạn sẽ có ngữ cảnh chỉ khớp với những nội dung mới được thêm vào. Bằng cách đó, mọi tìm kiếm/kết hợp jQuery sẽ xảy ra trong một tập hợp các phần tử HTML có giới hạn thay vì toàn bộ tài liệu. Ngoài ra, điều này ngăn chặn xử lý lại các yếu tố đã được xử lý. Bạn nên sử dụng $ (". Một điều", ngữ cảnh) cho hiệu quả bất cứ khi nào có thể áp dụng. – asiby

8

Nhân đôi năng

Lưu ý rằng Drupal.behaviors kiến ​​trúc chức năng trùng lặp đã có trong jQuery.

Ngoài ra, như các văn bản này, có vẻ không được bất kỳ tài liệu hoặc nghiên cứu tình huống cho Drupal.behaviors ngoài Drupal tự; và tài liệu trong Drupal (như đã nêu ở trên) có thể được hưởng lợi đáng kể từ những cải tiến. Theo văn bản này, có vẻ như tài liệu chi tiết chính là chỉ truy cập hạn chế phí.

Điều này có nghĩa là bạn có thể nhận thấy hiệu suất, sự bất thường và kết quả không mong muốn không phù hợp với tiêu chuẩn jQuery là đặc hữu của hệ sinh thái Drupal.behaviors.

Native jQuery Chức năng

Ngược lại với Drupal.behaviors, được xây dựng trong chức năng của jQuery API chuẩn là rộng rãi tài liệu bao gồm các cuộc biểu tình in-line và các ví dụ. Hơn nữa, có rất nhiều ví dụ trực tiếp tự do có sẵn trên các trang web như jsfiddle.

Các liên kết trong phần xem cũng liệt kê các yêu cầu api của jQuery liên quan đến việc xử lý các phần tử DOM mới được chèn vào tài liệu.

Xem thêm

+0

"có vẻ như không có bất kỳ tài liệu nào" Xin lỗi nhưng đó chỉ là sai. Chỉ cần tìm kiếm "jquery Drupal.behaviors" và bạn sẽ có 85k + kết quả. Dưới đây là một số trang trên trang đầu tiên của tôi: https://drupal.org/node/756722 http://blog.amazeelabs.com/de/comment/510193 http://drewish.com/2011/05/11/drupal -javascripting/ Chắc chắn có chỗ để cải thiện ở đây nhưng vì nó là câu trả lời của bạn là FUD hơn là hữu ích. –

+2

// dường như không có bất kỳ tài liệu hoặc nghiên cứu điển hình nào cho Drupal.behaviors *** bên ngoài Drupal *** // (nhấn mạnh không phải trong bản gốc) Xin vui lòng thêm bất kỳ giải thích hoặc sửa chữa hợp pháp nào, nhưng xác nhận bạn đã thực hiện ở đây không chính xác. Quan trọng nhất, bạn đã bỏ qua các từ "bên ngoài chính Drupal". Nếu có các khung công tác hoặc dự án khác đã sử dụng Drupal.behaviors, vui lòng thêm liên kết tại đây và cải thiện chất lượng câu trả lời. Vì nó là viết tắt của bây giờ, việc bổ sung không bác bỏ bất cứ điều gì trong câu trả lời ban đầu. – dreftymac

+0

Hành vi là Drupal cụ thể và đó là lý do tại sao không có tài liệu hoặc trường hợp sử dụng ngoài Drupal. Các hành vi mở rộng chức năng jQuery, chúng không nhân bản nó. Gửi bối cảnh và cài đặt không phải là thứ mà jQuery thực hiện. Và họ cũng cung cấp tích hợp với khung AJAX của Drupal. Nói rằng chúng trùng lặp jQuery thể hiện sự hiểu biết rất ít về API JavaScript Drupal. – Luxian

2

Tìm kiếm một câu trả lời tương tự và đến đây, vẫn không có manh mối. Cuối cùng tìm thấy một chút giải thích thêm (và các ví dụ) từ một bài viết ở đây: https://benmarshall.me/drupal-behaviors/

Tôi không phải là tác giả ban đầu, vì vậy tôi chỉ có thể trích dẫn một số văn bản:

Drupal Hành vi là gì?

Tóm lại, Drupal.behaviors là một cách mô đun và tốt hơn để triển khai jQuery.ready. Không giống như jQuery.ready chỉ chạy một lần khi DOM sẵn sàng cho thao tác, Drupal.behaviors có thể chạy nhiều lần trong khi thực thi trang. Thậm chí tốt hơn, chúng có thể được chạy bất cứ khi nào các phần tử DOM mới được chèn vào tài liệu (tức là AJAX nội dung được định hướng).

Drupal.behaviors cũng có thể ghi đè hoặc thậm chí mở rộng hành vi hiện tại . Ví dụ: nếu một hành vi mô-đun thêm hiệu ứng trả lại trên tất cả các liên kết, một mô-đun khác có thể thay thế hành vi đó bằng hiệu ứng trả lại khác nhau .

Một tiền thưởng thêm của Drupal.behaviors (bắt đầu trong Drupal 7), là khả năng sử dụng drupal_add_js (PHP) hoặc Drupal.settings.modulename (JS) và thông qua các thiết lập như một tham số thứ hai (con đầu tiên bối cảnh ) đối với hành vi.

4

Cùng với câu trả lời nêu trên vào trong những điều quan trọng là bạn có thể truyền dữ liệu từ php để javascript đó là như sau

giá trị Passing từ PHP để Javascript với "Drupal.settings"

Bạn có thể dễ dàng thực hiện các biến từ PHP có sẵn để Javascript trên front end với Drupal.settings sử dụng drupal_add_js() chức năng

<?php 
    drupal_add_js(array('myModule' => array('key' => 'value')), 'setting'); 
?> 

hoặc

<?php 
$element['#attached']['js'][] = array(
    'type' => 'setting', 
    'data' => array('myModule' => array('key' => 'value')), 
); 
?> 

này sẽ có sẵn trong Javascript như:

if (Drupal.settings.myModule.key === 'value') { 
    alert('Got it!'); 
    }