Je voudrais retarder ajax de se déclencher de la même manière que la saisie semi-automatique semble fonctionner. Par exemple, si un utilisateur tape, l'ajax ne fonctionnera pas avant que 500 ms ne se soient écoulées depuis la dernière frappe.
Je regarde actuellement les comportements de drupal.be mais je ne suis pas en mesure de le faire fonctionner.
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
$('input.andtimer', context).delay(500).ajaxStart();
}
};
Il s'agit de l'élément de formulaire auquel le comportement est attaché.
$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'),
),
);
Ce jsfiddle montre ce que j'essaie de réaliser.
Est-ce que comment remplacer Drupal.ajax.prototype.beforeSend? être un moyen de le faire?
Ce qui suit fonctionne pour le premier «ensemble» d'entrées avec la classe .andtimer. Il ne fonctionne pour aucun autre ensemble, l'ajax continue toujours avec le premier ensemble. Une idée sur comment réparer ça?
(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);
Utiliser $ form ['my_input'] ['# ajax'] ['event'] = 'finishinput' comme suggéré et
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);
}
});
Fonctionne pour chaque «groupe» d'entrées où le nombre d'entrées remplies doit être obtenu.
la source
Réponses:
Une option consiste à utiliser un événement jQuery personnalisé, par exemple. quelque chose comme entrée terminée . Définissez
$form['my_input']['#ajax']['event'] = 'finishedinput'
et fournissez du JS pour déclencher votre événement personnalisé après un délai approprié (similaire au JS du violon).la source
hook_js_alter()
pour m'assurer qu'il est utilisé à la place de l'original. (Mais à mon humble avis, le code ctools devrait utiliser Drupal.settings plutôt qu'une valeur codée en dur.)Cette approche présente à la fois l'avantage et l'inconvénient d'être appliquée à tous les événements AJAX déclenchés par des touches sur n'importe quelle page où ce script s'exécute.
la source
Voici le code que j'ai écrit:
la source
J'ai également essayé "beforeSend" sans trop de chance. Je suis alors tombé sur "beforeSubmit" et cela fait l'affaire pour moi. Vous pouvez également utiliser cette stratégie pour vous connecter à d'autres méthodes de prototype Drupal ajax (voir /misc/ajax.js pour toutes les méthodes originales):
la source