Я хотел бы отложить запуск ajax таким же образом, как кажется, что автозаполнение работает. Например, если пользователь печатает, ajax не будет работать, пока не истечет 500 мс с момента последнего нажатия клавиш.
В настоящее время я смотрю на 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'] = 'finishinput', как предложено, и
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);
}
});
Работает для каждой «группы» входов, где необходимо получить количество заполненных входов.
источник
Ответы:
Одним из вариантов является использование пользовательского события jQuery, например. что-то вроде готового ввода . Установите
$form['my_input']['#ajax']['event'] = 'finishedinput'
и предоставьте JS для запуска вашего пользовательского события после соответствующей задержки (аналогично JS в скрипке).источник
hook_js_alter()
чтобы убедиться, что он используется вместо оригинала. (Но на самом деле имхо код ctools должен использовать Drupal.settings, а не жестко запрограммированное значение.)Этот подход имеет как преимущество, так и недостаток, поскольку он применяется ко всем событиям AJAX, запускаемым с помощью ключа, на любой странице, где выполняется этот сценарий.
источник
Это код, который я написал:
источник
Я также попытался "beforeSend" без особой удачи. Затем я наткнулся на «beforeSubmit», и это помогает мне. Вы можете использовать эту стратегию для подключения других методов-прототипов Drupal ajax (см. /Misc/ajax.js для всех оригинальных методов):
источник