Ich möchte Ajax daran hindern, auf die gleiche Weise zu feuern, wie die automatische Vervollständigung zu funktionieren scheint. Wenn ein Benutzer beispielsweise tippt, wird der Ajax erst ausgeführt, nachdem seit der letzten Eingabe 500 ms verstrichen sind.
Ich schaue gerade auf drupal.behaviors, kann es aber nicht zum Laufen bringen.
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
$('input.andtimer', context).delay(500).ajaxStart();
}
};
Dies ist das Formularelement, an das das Verhalten angehängt ist.
$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'),
),
);
Diese jsfiddle zeigt, was ich erreichen will .
Würde Drupal.ajax.prototype.beforeSend überschrieben? ein Weg sein, dies zu beseitigen?
Das Folgende funktioniert für den ersten 'Satz' von Eingaben mit der Klasse .andtimer. Es funktioniert bei keinem anderen Satz, der Ajax fährt immer mit dem ersten Satz fort. Irgendwelche Ideen, wie man das behebt?
(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);
Verwenden von $ form ['my_input'] ['# ajax'] ['event'] = 'finishinput' wie vorgeschlagen und
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);
}
});
Funktioniert für jede 'Gruppe' von Eingaben, bei denen die Anzahl der gefüllten Eingaben ermittelt werden muss.
quelle
Antworten:
Eine Möglichkeit besteht darin, ein benutzerdefiniertes jQuery-Ereignis zu verwenden, z. so etwas wie fertige Eingabe . Stellen Sie
$form['my_input']['#ajax']['event'] = 'finishedinput'
einige JS ein und stellen Sie sie bereit, um Ihr benutzerdefiniertes Ereignis nach einer angemessenen Verzögerung auszulösen (ähnlich wie bei JS in der Geige).quelle
hook_js_alter()
um sicherzustellen, dass sie anstelle des Originals verwendet wird. (Aber wirklich imho sollte der ctools-Code Drupal.settings anstelle eines fest codierten Werts verwenden.)Dieser Ansatz hat sowohl den Vorteil als auch den Nachteil, dass er für alle durch Keyups ausgelösten AJAX-Ereignisse auf jeder Seite angewendet wird, auf der dieses Skript ausgeführt wird.
quelle
Dies ist der Code, den ich geschrieben habe:
quelle
Ich habe auch "beforeSend" ohne viel Glück versucht. Ich bin dann auf "beforeSubmit" gestoßen und das macht den Trick für mich. Mit dieser Strategie können Sie sich auch in andere Drupal-Ajax-Prototypmethoden einbinden (alle Originalmethoden finden Sie unter /misc/ajax.js):
quelle