Как инициировать onkeyup событие, это отложено, пока пользователь не приостанавливает их ввод?

К сожалению, это невозможно при использовании стандартного движка шаблонов Django. Вам нужно будет написать что-то ужасное, чтобы подражать переключателю.

{% if a %}
    {{ a }}
{% else %}
    {% if b %}
        {{ b }}
    {% else %}
        {% if c %}
            {{ c }}
        {% else %}
            {{ default }}
        {% endif %}
    {% endif %}
{% endif %}

или если только один, если условие может быть истинным, и вам не нужно значение по умолчанию.

{% if a %}
{{ a }}
{% endif %}
{% if b %}
{{ b }}
{% endif %}
{% if c %}
{{ c }}
{% endif %}

Обычно, когда движок шаблонов недостаточно мощный, чтобы выполнить то, что вам нужно, это признак того, что код следует переместить в представление Django, а не в шаблон. Например:

# Django view
if a:
  val = a
elif b:
  val = b
elif c:
  val = c
else:
  val = default

# Template
{{ val }}
34
задан Trevor 27 January 2016 в 18:39
поделиться

4 ответа

Вы можете объединить обработчик событий keypress с setTimeout , чтобы вы отправляли запрос Ajax через заданное время после нажатия клавиши, отмены и перезапуска таймер, если еще одно нажатие клавиши происходит до окончания таймера. Предполагая, что у вас есть текстовое поле с идентификатором myTextArea и функция обратного вызова Ajax с именем doAjaxStuff :

function addTextAreaCallback(textArea, callback, delay) {
    var timer = null;
    textArea.onkeypress = function() {
        if (timer) {
            window.clearTimeout(timer);
        }
        timer = window.setTimeout( function() {
            timer = null;
            callback();
        }, delay );
    };
    textArea = null;
}

addTextAreaCallback( document.getElementById("myTextArea"), doAjaxStuff, 1000 );
66
ответ дан 27 November 2019 в 16:13
поделиться

Я бы лично использовал setInterval , который отслеживал бы изменения в текстовой области и выполнял бы обратные вызовы AJAX только при обнаружении внесенных изменений. каждая секунда должна быть быстрой и достаточно медленной.

1
ответ дан 27 November 2019 в 16:13
поделиться

Если вас интересуют решения jQuery, jQuery Suggest - хорошая реализация.

Нет смысла каждый раз изобретать колесо.

0
ответ дан 27 November 2019 в 16:13
поделиться

Другая альтернатива - использовать небольшой плагин jQuery под названием bindWithDelay. Он использует ту же технику setTimeout, что и принятый ответ, но обрабатывает таймауты прозрачно, так что ваш код будет немного легче читать. исходный код можно посмотреть на github.

$("#myTextArea").bindWithDelay("keypress", doAjaxStuff, 1000)
10
ответ дан 27 November 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: