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

#javascript #jquery #autosave

#javascript #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   "amp;value="   value),
            success: function (data) {
                if (data) {
                    $('#saved-signal').show().fadeOut(1500);
                }
            }
        });
    }
 

У меня есть несколько текстовых полей на странице, и я бы хотел, чтобы они автоматически сохраняли вводимый пользователем. Редактируемые данные представляют собой набор пар ключ / значение, текстовая область является значением, а атрибут текстовой области ‘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);
    });
 

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

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

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

Спасибо

Спасибо

Ответ №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);
});