оптимизировать текст автосохранения jquery

$("textarea").bind("keyup", function () {

            var keyName = $(this).attr("data-rkn-keyName");
            autoSave(keyName, this.value);

    });

    function autoSave(key, value) {
        $.ajax({
            url: "/Admin/SaveLookup",
            type: "POST",
            data: ("keyName=" + key + "&value=" + value),
            success: function (data) {
                if (data) {
                    $('#saved-signal').show().fadeOut(1500);
                }
            }
        });
    }

У меня есть несколько текстовых полей на странице, и я бы хотел, чтобы они автоматически сохраняли ввод пользователя. Редактируемые данные представляют собой набор пар ключ/значение, где textarea является значением, а атрибут textarea 'data-rkn-keyName' является ключом.

Таким образом, приведенный выше код работает, но если пользователь быстро печатает, он не поймает последний символ или два. Поэтому я изменил его так:

$("textarea").bind("keydown", function () {
    var keyName = $(this).attr("data-rkn-keyName");
    var keyValue = $(this).value;
        setTimeout(function (keyName, keyValue) {
            autoSave(keyName, keyValue);
        }, 2000);
    });

Таким образом, добавление таймера ломает его, автосохранение вызывается, но у меня такое чувство, что переменные теряют свои значения… возможно, это связано с областью видимости переменных. Так что это незначительная проблема, которую я могу решить ... что более важно (и цель моего поста), вопрос: буду ли я создавать новый объект таймера и вызов ajax (= попадание в базу данных) каждый раз, когда нажимается клавиша? Или setTimeout сбрасывает один и тот же объект, если вы вызываете его повторно?

Я хотел бы вызвать функцию автосохранения через секунду или две после нажатия клавиши, но только если в течение этого времени не нажимается клавиш... другими словами, если пользователь делает паузу в течение 2 секунд... запускает сохранение функция.

Или, может быть, есть лучший способ сделать автосохранение?

благодарю вас

Благодарность


person J Benjamin    schedule 25.06.2014    source источник


Ответы (1)


setTimeout принимает анонимную функцию без аргументов. Когда вы включили keyName и keyValue в качестве входных аргументов, анонимная функция получит nil для обоих аргументов. Просто удалите аргументы, и значения будут успешно переданы.

$("textarea").bind("keydown", function () {
    var keyName = $(this).attr("data-rkn-keyName");
    var keyValue = $(this).value;
    setTimeout(function () {
        autoSave(keyName, keyValue);
    }, 2000);
});
person Fabricator    schedule 26.06.2014