AJAX自动保存功能

30

有没有实现自动保存功能的最佳JavaScript库、插件或扩展库?

具体需要能够“保存”数据网格。类似Gmail和Google文档的自动保存。

如果已经发明了轮子,我就不想再重新发明一次。我正在寻找一个已经存在的神奇autoSave()函数的实现。

自动保存:将数据推送到服务器代码进行保存,通常是数据库。服务器代码框架超出了本问题的范围。

请注意,我不是在寻找Ajax库,而是在寻找一个更高层次的库/框架:与表单本身交互。

daemach在jQuery上介绍了一个实现 @ http://daemach.blogspot.de/2007/03/autosave-jquery-plugin.html [脚本主机已停机]。但我不确定它是否符合稳定、轻量级和良好设计的标准。

标准

  • 稳定、轻量级和良好设计
  • 在onChange和/或onBlur时保存
  • 不会频繁地保存,只按给定的毫秒数保存一次
  • 处理同时发生的多个更新
  • 如果自上次保存以来没有更改,则不会保存
  • 针对每个输入类别保存到不同的URL

我有点困惑于"自动保存"的作用是什么,为什么你想要自动保存呢?也许如果我了解你打算用它实现什么,我可以找到其他兼容的替代方案。 - Ape-inago
我有一个数据网格样式的页面,我不希望它像HTML表单一样运作。 对于自动保存,请考虑Gmail和Google文档。 - antony.trupe
8个回答

50

自动保存应该很容易实现,您可以使用其中一个主要框架,如jQuery或MooTools。只需在用户编辑应该自动保存的内容后使用window.setTimeout(),并让该超时调用JavaScript框架的标准AJAX即可。

例如(使用jQuery):

var autosaveOn = false;
function myAutosavedTextbox_onTextChanged()
{
    if (!autosaveOn)
    {
        autosaveOn = true;

        $('#myAutosavedTextbox').everyTime("300000", function(){
             $.ajax({
                 type: "POST",
                 url: "autosavecallbackurl",
                 data: "id=1",
                 success: function(msg) {
                     $('#autosavenotify').text(msg);
                 }
             });
        }); //closing tag
    }
}

谢谢,不过这是在重新发明轮子,而我正试图避免这样做。 - antony.trupe
44
我有点困惑。您正在寻找一个使用现有框架的解决方案。上面的例子完全基于jQuery,这是一个非常丰富的JavaScript框架,在我提供的18行示例中隐藏了上面示例的真正复杂性。如果那不是您要找的...那么您到底在寻找什么? - jrista
1
其实,我猜有时候只是要找到那些神奇的术语,让谷歌吐出正确的答案。 :P 尝试这个:http://daemach.blogspot.com/2007/03/autosave-jquery-plugin.html - jrista
2
重新发明轮子 - Byte Lab
2
不幸的是,在daemach的博客文章中,脚本的链接现在重定向到一个虚假的反病毒页面。 - Mark Berry
显示剩余7条评论

23

我知道这个问题很旧了,但我想分享一段我最喜欢的代码。我在这里找到了它: http://codetunnel.io/how-to-implement-autosave-in-your-web-app/

以下是代码:

var $status = $('#status'),
    $commentBox = $('#commentBox'),
    timeoutId;

$commentBox.keypress(function () { // or keyup to detect backspaces
    $status.attr('class', 'pending').text('changes pending');

    // If a timer was already started, clear it.
    if (timeoutId) clearTimeout(timeoutId);

    // Set timer that will save comment when it fires.
    timeoutId = setTimeout(function () {
        // Make ajax call to save data.
        $status.attr('class', 'saved').text('changes saved');
    }, 750);
});

当用户停止输入超过750毫秒时,它会自动保存。

它还具有状态指示功能,让用户知道更改是否已保存。


3
我也喜欢这个,运作得很好,文章也不错。我唯一改变的是将 "keypress" 改成了 "keyup"。这样可以确保删除按键也被检测到... - rept

4
您可以使用超时来节省一些时间,但更好的方法可能是使用某种 onchange 事件处理程序,以便在数据更改时,如果您没有在设定的时间内保存,则保存,但不要在每个按键上保存。
因此,在调用 ajax 函数之前,您需要查看上次保存的时间。
这将使您仅在需要时以预定速率保存。因此,如果您想每隔 5 分钟保存一次,则无论进行了哪些更改,如果在该 5 分钟窗口内进行了更改,则保存。
发出 ajax 调用很简单,但 jQuery 可以简化它。不幸的是,根据我所见,为了获得您想要的内容,您将需要实现自己的功能。以一般方式进行操作很困难,因为不同的人可能只想在特定字段更改时保存。因此,仅因为我点击了选择框并不意味着会触发保存函数,但在文本框中更改某些内容可能会这样做。

这个答案走在正确的道路上,尽管它归结为“我不知道”。 - antony.trupe

1

为了在cookie中简单地自动保存表单字段,我使用这个很棒的插件http://rikrikrik.com/jquery/autosave/。它不会将数据发送到服务器,但如果您找不到更好的东西,升级它的功能比从头开始做要容易得多。


0
我建议您使用jQuery。当然,“保存”部分仍然需要在后端完成,但是jQuery使得提交AJAX请求变得轻而易举。
如果您有一个ASP.NET后端,您可以简单地调用WebMethod并在指定的时间间隔内提交相关字符串(文本框内容等)。
[WebMethod]
public void AutoSave(String autoSaveContent)
{
 // Save
}

调用此方法的jQuery请求如下:

$.ajax({  
type: "POST",  
contentType: "application/json; charset=utf-8",  
url: "AutoSaveService.asmx/AutoSave", 
data: "{textBoxToAutosaveText}",  
dataType: "json"
});  

就这些了。你可以在http://jquery.com/找到jQuery。


0
如果您正在寻找简单和轻量级的解决方案,我认为最轻量级的方式是使用JavaScript内置的setTimeout()函数。将其与您选择的AJAX框架结合使用,您就可以开始了。
function autoSave()
{
  $.get(URL, DATA); // Use any AJAX code here for the actual autosaving. This is lightweight jQuery.
  setTimeout("autoSave()", 60000); // Autosaves every minute.
}
autoSave(); // Initiate the auto-saving.

10
使用GET HTTP动词存储数据是不好的实践。所有的GET请求都应该是幂等的。如果你决定使用这种解决方案,请使用$.post()代替。 - John Kary

0

同步是一个jQuery插件,它为您的HTML页面添加功能,定期自动将用户输入发送回服务器。(源代码

JavaScript和HTML示例:

<script>
  $("input").synchronize();
</script>

<input type="text" value="initial_value" 
       class="{url:'/entity.cfc?method=updateDescription',data:{ID1:'1',ID2:'2'}}" />

默认延迟1秒后的Ajax请求结果:

http://localhost/entity.cfc?method=updateDescription&value=update_value&preVal=initial_value&ID1=1&ID2=2

问题出在后端。表单通常涉及一次更新一组字段。你的后端能够逐个字段进行更新吗?这需要编写大量代码。你每秒至少要访问服务器两次。通过具有“PK”值,你正在公开有关实现的详细信息。最后,pk_attribute不是INPUT项的有效属性。你所得到的示例都很简单和小型。你想要更小的东西,但它并不存在。 - jmucchiello
把这个表单看作是一个数据网格(或一系列的表单),而不是一个实际的表单。 PK的批评在某种程度上是有效的。向浏览器提供的页面是带有xsl样式表的xml,而不是纯html。 然而,它似乎有些笨拙:我不知道如何优雅地解决它。仍然开放其他选项。 - antony.trupe
元数据是 pk_attribute 不是有效属性 的答案。http://docs.jquery.com/Plugins/Metadata/metadata - antony.trupe

0
难道你只需要一个每隔x秒触发的计时器吗?回调函数将执行一个AJAX回传到服务器,其中包含一个添加了“autosave=true”字段的表单。只需在服务器上处理此回传即可完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接