Me gustaría retrasar el disparo de ajax de la misma manera que el autocompletado parece funcionar. Por ejemplo, si un usuario está escribiendo, el ajax no se ejecutará hasta que hayan transcurrido 500 ms desde el último keyup.
Actualmente estoy viendo drupal.behaviors pero no puedo hacer que funcione.
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
$('input.andtimer', context).delay(500).ajaxStart();
}
};
Este es el elemento de formulario al que se adjunta el comportamiento.
$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'),
),
);
Este jsfiddle muestra lo que estoy tratando de lograr.
¿ Cómo anular Drupal.ajax.prototype.beforeSend? ser una ruta para acabar con esto?
Lo siguiente funciona para el primer 'conjunto' de entradas con la clase .andtimer. No funciona para ningún otro conjunto, el ajax siempre continúa con el primer conjunto. Alguna idea de cómo solucionar este problema?
(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);
Usando $ form ['my_input'] ['# ajax'] ['event'] = 'finishedinput' como se sugiere y
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);
}
});
Funciona para cada 'grupo' de entradas donde se necesita obtener el recuento de entradas llenas.