我想以自动完成功能似乎起作用的方式延迟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);
}
});
适用于需要获取填充输入数量的每个“输入”组。
该代码与keyup / keydown或您要暗示的事件绑定无关,您可以添加实际的代码吗?请记住,如果您只是在寻找一般的javascript帮助,则不是找到它的地方。规则是:首先让它在Drupal之外工作,如果您无法在 Drupal 内工作,请在这里提问
—
Clive
感谢Clive,我添加了代码来构建输入。我直接尝试并使其在Drupal中工作。仍在学习。我将它带到外面去,看看我能否再澄清一下这个问题。
—
Inigo Montoya 2014年
我讲得太早了,没有意识到您要做到这一点与Drupal有多紧密。这引起了一个非常有趣的问题:)
—
克莱夫(Clive
底部的代码段对我来说效果很好,除了触发事件之后,该领域失去了焦点。我该如何做,以便在射击后将注意力集中在元素上。
—
VanD