Gostaria de adiar o disparo do ajax da mesma maneira que o preenchimento automático parece funcionar. Por exemplo, se um usuário digitar, o ajax não será executado até que 500ms tenham decorrido desde a última instalação.
Atualmente, estou olhando para drupal.behaviors, mas não consigo fazê-lo funcionar.
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
$('input.andtimer', context).delay(500).ajaxStart();
}
};
Este é o elemento do formulário ao qual o comportamento está anexado.
$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 mostra o que estou tentando alcançar.
Would Como substituir Drupal.ajax.prototype.beforeSend? ser um caminho para derrubar isso?
O seguinte funciona para o primeiro 'conjunto' de entradas com a classe .andtimer. Não está funcionando para nenhum outro conjunto, o ajax sempre continua com o primeiro conjunto. Alguma idéia de como corrigir isso?
(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' conforme sugerido e
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);
}
});
Trabalha para cada 'grupo' de insumos onde é necessário obter a contagem de insumos preenchidos.
fonte
Respostas:
Uma opção é usar um evento jQuery personalizado, por exemplo. algo como entrada acabada . Defina
$form['my_input']['#ajax']['event'] = 'finishedinput'
e forneça algumas JS para acionar seu evento personalizado após um atraso apropriado (semelhante à JS no violino).fonte
hook_js_alter()
para garantir que ele seja usado no lugar do original. (Mas realmente imho os ctools código deve usar Drupal.settings em vez de um valor hard-coded.)Essa abordagem tem a vantagem e a desvantagem de ser aplicada a todos os eventos AJAX acionados por keyup em qualquer página em que esse script seja executado.
fonte
Este é o código que escrevi:
fonte
Eu também tentei "beforeSend" sem muita sorte. Eu então tropecei no "beforeSubmit" e isso faz o truque para mim. Você pode usar esta estratégia para conectar-se a outros métodos de protótipo Drupal ajax (consulte /misc/ajax.js para todos os métodos originais):
fonte