Trong dự án của tôi, tôi đã viết mã JavaScript được xác định rõ, cập nhật số liệu thống kê trang sau cuộc gọi AJAX.
Vì tôi muốn sử dụng lại các hàm mà không đi đến mức "mở rộng jQuery", tôi đã kết thúc với giải pháp sau, sử dụng hàm jQuery hiện có, thay vì xác định một hàm mới. Điều này được lấy cảm hứng từ những gì mô-đun 'cờ' thực hiện - nó chỉ đơn giản là kích hoạt một sự kiện và cho phép nhiều người nghe sự kiện Javascript hành động để phản ứng, trái ngược với việc chỉ có một plugin / tiện ích mở rộng jQuery tùy chỉnh được mã hóa cứng như trong giải pháp khám phá trong các câu trả lời trước.
Trong một mô-đun Drupal:
// in_some_ajax_function()
$commands[] = ajax_command_invoke('html', 'trigger', array('MY_EVENT'));
Trong Javascript:
// Added an event binding to my $(document).ready();
$(document).ready(function(){
$(document).bind('MY_EVENT', function() {
alert('MY_EVENT');
});
});
Tôi đã phải lưu ý rằng tham số đầu tiên cho ajax_command_invoke là KHÔNG BAO GIỜ bất kỳ đối tượng JavaScript gốc nào, vì vậy, sau đây không bao giờ hoạt động, bởi vì nó chuyển thành bộ chọn 'tài liệu' (phần tử):
// This tries to select $('document')
// ... which is nothing, since there are no 'document' elements.
$commands[] = ajax_command_invoke('document', 'trigger', array('MY_EVENT'));
Thật kỳ lạ, ràng buộc $(document)
và kích hoạt trên $('html')
là tương thích. Tôi cho rằng bạn có thể trở nên rất sáng tạo và liên kết / kích hoạt các yếu tố cụ thể hơn, ở cấp độ sâu hơn. Nếu bạn có thể nghĩ về một kịch bản trong đó làm như vậy có ý nghĩa hơn một trình kích hoạt sự kiện cấp cao nhất, vui lòng bình luận!