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.
fuente
Respuestas:
Una opción es usar un evento jQuery personalizado, por ejemplo. algo así como entrada terminada . Configure
$form['my_input']['#ajax']['event'] = 'finishedinput'
y proporcione algunos JS para activar su evento personalizado después de un retraso apropiado (similar al JS en el violín).fuente
hook_js_alter()
para asegurarme de que se usa en lugar del original. (Pero realmente, en mi opinión, el código de ctools debería usar Drupal.settings en lugar de un valor codificado).Este enfoque tiene la ventaja y la desventaja de aplicarse a todos los eventos AJAX activados por keyup en cualquier página donde se ejecute este script.
fuente
Este es el código que escribí:
fuente
También probé "beforeSend" sin mucha suerte. Luego me topé con "beforeSubmit" y eso me sirve. También puede usar esta estrategia para conectar otros métodos prototipo de Drupal ajax (consulte /misc/ajax.js para ver todos los métodos originales):
fuente