#ajax #events #jsf
#ajax #Мероприятия #jsf
Вопрос:
У меня есть f:ajax
тег внутри h:inputText
тега, который вызывает ajax-вызовы для событий keyup :
<h:inputText id="searchinput" value="#{tvShowForm.name}">
<f:ajax event="keyup" render="results" listener="#{tvShowForm.search}" />
</h:inputText>
Каждый вызов занимает достаточно времени, чтобы пользователь набрал несколько символов до завершения первого вызова.
Есть ли способ отменить текущий вызов ajax (и поставленные в очередь), чтобы последнее событие keyup немедленно выполняло вызов ajax?
Ответ №1:
Похоже, вы хотите объединить события, например, это будет ждать полсекунды, прежде чем запускать ajax-запрос, и любой ввод, введенный в этот момент, будет включен. Но вы не будете запускать ajax-запрос для каждого введенного символа.
<h:inputText onkeyup="keyupHandler();"/>
...
<script>
var keystrokeTimeout;
keyupHandler = function(event) {
var minChars = 4;
var len = $(this).val().length;
if((len != 0) amp;amp; (len < minChars)) {
return;
}
var ajaxRequest = function() {
jsf.ajax.request('results', null, {
execute: 'results',
render: 'results'
});
}
clearTimeout(keystrokeTimeout);
keystrokeTimeout = setTimeout(ajaxRequest, 500); // millisecs
}
</script>
Это отдаленно похоже на то, что вы хотите сделать?
РЕДАКТИРОВАТЬ: Другое предложение заключается в том, чтобы вы проверили функциональность Richfaces 4 a4j: queue. Это позволяет комбинировать события, например, в сценарии ввода, если вы опирались на клавиатуру, когда завершается текущий ajax-запрос, будет отправлен только один дополнительный запрос. Также можно указать задержку запроса и игнорировать устаревшие ответы. Большая ошибка, которую Richfaces не делает (которую делают primefaces), заключается в том, что RF использует ту же базовую очередь, что и реализация JSF, поэтому у вас нет риска обработки не по порядку.
Я ценю, что если вы еще не используете эту библиотеку, это не маленький шаг.
Комментарии:
1. Спасибо Oversteer, это именно то, что я в итоге делал тем временем ^^. Если через несколько дней не будет опубликовано лучшего решения, я буду придерживаться его и назначу вам награду.