简化jquery自动保存文本

时间:2014-06-25 23:40:53

标签: javascript jquery autosave

$("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);
                }
            }
        });
    }

我在页面上有几个textareas,我希望他们自动保存用户输入。正在编辑的数据是一组键/值对,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);
    });

因此,添加计时器会打破它,autoSave会被调用,但我感觉vars正在丢失它们的值.....可能与变量范围有关。所以这是一个小问题,我可以解决...更重要的是(以及我的帖子的目的),问题:每次按下一个键时,我是否会实例化一个新的计时器对象和一个ajax调用(=数据库命中)?或者如果你反复调用它,setTimeout会重置相同的对象吗?

我想要的是在按下按键后调用autoSave功能一两秒,但只有在此期间没有按下按键...换句话说,如果用户暂停2秒......启动保存功能。

或许有更好的方法可以进行自动保存?

谢谢

感谢

1 个答案:

答案 0 :(得分:0)

setTimeout接受一个没有任何参数的匿名函数。当您包含keyNamekeyValue作为输入参数时,匿名函数将为两个参数接收nil。只需删除参数,值就会成功传递。

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