オートコンプリートが機能しているように見えるのと同じ方法で、ajaxの起動を遅らせたいと思います。たとえば、ユーザーが入力した場合、最後のキーアップから500ミリ秒が経過するまでajaxは実行されません。
私は現在drupal.behaviorsを見ていますが、それを機能させることができません。
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
$('input.andtimer', context).delay(500).ajaxStart();
}
};
これは、ビヘイビアーがアタッチされるフォーム要素です。
$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'),
),
);
このjsfiddleは、私が達成しようとしていることを示しています。
Drupal.ajax.prototype.beforeSendをオーバーライドするにはどうすればよいですか?これを取り除くためのルートになりますか?
以下は、クラス.andtimerの入力の最初の「セット」に対して機能します。他のセットでは機能しません。ajaxは常に最初のセットから続行します。これを修正する方法はありますか?
(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);
提案されているように$ form ['my_input'] ['#ajax'] ['event'] = 'finishedinput'を使用し、
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);
}
});
満たされた入力の数を取得する必要がある入力の「グループ」ごとに機能します。