Saya ingin menunda ajax dari menembak dengan cara yang sama bahwa autocomplete tampaknya berfungsi. Misalnya, jika pengguna mengetik, ajax tidak akan berjalan hingga 500ms telah berlalu sejak keyup terakhir.
Saat ini saya sedang melihat drupal.behaviors tetapi tidak dapat membuatnya berfungsi.
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
$('input.andtimer', context).delay(500).ajaxStart();
}
};
Ini adalah elemen bentuk tempat perilaku dilampirkan.
$form['my_input'] = array(
'#type' => 'textfield',
'#default_value' => $value,
'#ajax' => array(
'callback' => 'my_callback',
'event' => 'keyup',
'wrapper' => 'my_wrapper',
'trigger_as' => array(
'name' => 'my_button',
),
'progress' => array('type' => 'none'),
),
'#attributes' => array(
'class' => array('andtimer'),
),
);
Jsfiddle ini menunjukkan apa yang saya coba capai.
Apakah Cara mengganti Drupal.ajax.prototype.beforeSend? menjadi rute untuk mencatat ini?
Berikut ini berfungsi untuk 'set' input pertama dengan class .andtimer. Itu tidak bekerja untuk set lain, ajax selalu berlanjut dengan set pertama. Ada ide bagaimana cara memperbaikinya?
(function($, Drupal) {
Drupal.behaviors.bform = {
attach : function(context, settings) {
var events = $('.andtimer').clone(true).data('events');
$('.andtimer').unbind('keyup');
var typingTimer;
var doneTypingInterval = 300;
$('.andtimer').keyup(function() {
clearTimeout(typingTimer);
typingTimer = setTimeout(doneTyping, doneTypingInterval);
function doneTyping() {
$.each(events.keyup, function() {
this.handler();
});
}
return false;
});
}
};
})(jQuery, Drupal);
Menggunakan $ form ['my_input'] ['# ajax'] ['event'] = 'finishedinput' seperti yang disarankan dan
var typingTimer;
var doneTypingInterval = 600;
$('.andtimer').on('keyup', function (e) {
clearTimeout(typingTimer);
if ($(this).val) {
var trigid = $(this);
typingTimer = setTimeout(function(){
trigid.triggerHandler('finishedinput');
}, doneTypingInterval);
}
});
Berfungsi untuk setiap 'kelompok' input di mana jumlah input yang diisi perlu diperoleh.
sumber
Jawaban:
Salah satu opsi adalah menggunakan acara jQuery khusus, mis. sesuatu seperti selesai input . Tetapkan
$form['my_input']['#ajax']['event'] = 'finishedinput'
dan sediakan beberapa JS untuk memicu acara khusus Anda setelah penundaan yang sesuai (mirip dengan JS dalam biola).sumber
hook_js_alter()
untuk memastikan itu digunakan sebagai pengganti yang asli. (Tapi benar-benar imho kode ctools harus menggunakan Drupal.settings daripada nilai hard-coded.)Pendekatan ini memiliki kelebihan dan kekurangan diterapkan untuk semua peristiwa AJAX yang dipicu keyup pada halaman mana pun skrip ini berjalan.
sumber
Ini adalah kode yang saya tulis:
sumber
Saya juga mencoba "mengirim dulu" tanpa banyak keberuntungan. Saya kemudian menemukan "beforeSubmit" dan itu berhasil bagi saya. Anda dapat menggunakan strategi ini untuk menghubungkan ke metode prototipe ajax Drupal lainnya juga (lihat /misc/ajax.js untuk semua metode asli):
sumber