Tôi có một mô-đun cập nhật một nút thông qua ajax khi nhấp vào một liên kết.
Liên kết là một chuyển đổi, nó sẽ cập nhật nút có giá trị 1 ở lần nhấp đầu tiên, sau đó với giá trị 0 ở lần nhấp tiếp theo, v.v. Giống như bật / tắt một cái gì đó.
Mã dưới đây hoạt động ở lần nhấp đầu tiên sau khi tải trang, nhưng không phải vào lần nhấp tiếp theo. Tôi tin rằng Drupal.attachBehaviors phải được gọi / kích hoạt sau mỗi lần nhấp, nhưng tôi không thể tìm ra cách để làm điều này.
Mô-đun
function mymodule_menu() { $items['mypath/%/%/ajax'] = array( 'title' => 'My title', 'page callback' => 'mymodule_ajax_callback', 'page arguments' => array(1,2), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); ... } function mymodule_ajax_callback($id, $status) { //Validation[...] //Node Update using $id as the nid and $status as the field value[...] // Define a new array to hold our AJAX commands. $ajax_commands = array(); // Create a new AJAX command that replaces the #div. $replacedivid = '#status'.$id; $replacestring = '<div id="status'.$id.'"><a data-url="'.base_path().'mypath/'.$id.'/'.$new_status.'/ajax" title="This item is marked as '.$status_text.'" id="statuslink'.$id.'" class="midui">'.$status_text.'</a></div>'; $ajax_commands[] = ajax_command_replace($replacedivid, $replacestring); return drupal_json_output($ajax_commands); }
Javascript
(function ($) { Drupal.behaviors.mymodule = { attach: function(context, settings) { var $uilink = $('.midui'); //find all links for (var i=0;i<$uilink.length;i++) { //Loop var $link = $('#' + $uilink[i].id); if (!$link.hasClass("middone")) { new Drupal.ajax('#' + $uilink[i].id, $link, { url: $link.attr('data-url'), effect: 'fade', settings: {}, progress: { type: 'throbber' }, event: 'click tap' }); $link.addClass("middone"); //add class when we're done } } } } })(jQuery);
Những gì tôi đã cố gắng cho đến nay:
(a) Thêm một ajax_command_invoke(NULL, 'mymodule');
vào mảng $ ajax_commands kết hợp với một $.fn.mymodule
hàm
(b) Thêm $('body').ajaxSuccess(Drupal.attachBehaviors);
vào javascript của tôi. ajaxComplete cũng đã thử. Đã thử nó trên tài liệu là tốt.
(c) Tạo một lệnh tùy chỉnh như chi tiết tại đây http://www.jaypan.com/tutorial/calling-feft-after-ajax-event-drupal-7
Lưu ý: Tôi biết rằng đó chỉ là vấn đề kích hoạt tệp đính kèm sau mỗi lần nhấp để 'ajaxify' html mới được chèn / sửa đổi. Nếu tôi nhấp vào liên kết và sau đó nhập Drupal.attachBehaviors () trong bảng điều khiển, liên kết sẽ được xử lý lại bằng javascript của tôi, bằng chứng là việc thêm lớp 'middone' và có thể được nhấp lại.
Lưu ý: Cũng đáng quan tâm, nếu tôi để $ajax_commands
trống và trả lại (mảng trống) ở cuối chức năng gọi lại, liên kết sẽ vẫn có thể nhấp vào lần nhấp đầu tiên và tiếp theo. Nó sẽ có chức năng mà tôi đang tìm kiếm (một chuyển đổi). Tuy nhiên, vì không có thay đổi nào được thực hiện đối với html sau mỗi lần nhấp, nên không có cách nào để người dùng biết liệu bật hay tắt.
Bât cư thông tin được cung câp nao cung được la sự suât hiện tuyệt vơi.
================================================== =====
Trả lời một phần:
Hàm thành công của Drupal ajax.js chỉ gắn lại các hành vi cho các biểu mẫu (tôi nghĩ sao?)
if (this.form) {
var settings = this.settings || Drupal.settings;
Drupal.attachBehaviors(this.form, settings);
}
vì vậy tôi quyết định hack tất cả chức năng thành công của các đối tượng ajax.
Javascript bây giờ trở thành
(function ($) {
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
var $uilink = $('.midui'); //find all links
for (var i=0;i<$uilink.length;i++) { //Loop
var $link = $('#' + $uilink[i].id);
if (!$link.hasClass("middone")) {
myAjax = new Drupal.ajax('#' + $uilink[i].id, $link, {
url: $link.attr('data-url'),
effect: 'fade',
settings: {},
progress: {
type: 'throbber'
},
event: 'click tap'
});
myAjax.options.success = function (response, status) {
//Trigger Attach Behaviors
setTimeout(function(){Drupal.attachBehaviors($(myAjax.selector))}, 0);
// Sanity check for browser support (object expected).
// When using iFrame uploads, responses must be returned as a string.
if (typeof response == 'string') {
response = $.parseJSON(response);
}
return myAjax.success(response, status);
}
$link.addClass("middone"); //add class when we're done
}
}
}
}
})(jQuery);
Hàm thành công là một bản sao dán của mặc định từ ajax.js với một dòng được thêm vào cho các hành vi gắn lại. Vì một số lý do, Drupal.attachBehaviors
phải ở trong một bộ đếm thời gian. Tôi không thể tự mình làm điều đó vì một lý do mà tôi bỏ qua.
Tôi sẽ để câu hỏi này mở cho một vài người trong trường hợp ai đó có thể tìm ra giải pháp thanh lịch hơn và / hoặc giải thích sự kỳ lạ của bộ đếm thời gian.
Cảm ơn nhiều