如何实现 segmentfault 提问题不保存会自动创建一份草稿


由于有多个表单需要填写,每个表单未填写完成就要保存到草稿

初步想法是将表单url和表单数据记录下来,在触发onbeforeunload时间的时候保存下来,至于数据,我想存储在本地,这样减轻了服务器的压力 在onload的时候读取这些数据

web

普崔希德叫兽 9 years, 9 months ago

这个是通过js来操控的,触发事件(比如:输入几个字符后,一段时间后,键盘按下与弹出)这些事件,通过js都是能轻而易举的捕捉到,然后运用ajax向服务器发送请求,然后创建一份草稿。

屁股坐麻了 answered 9 years, 9 months ago


 define("autoSave", ["jquery"],
function(e) {
    var t, n, i, a = e("#editorStatus"),
    r = function() {};
    return r.prototype.bind = function(n, r) {
        t = n,
        this.form = r,
        i = this,
        e("[name=title]").on("input",
        function() {
            "" !== e.trim(e(this).val()) && i.change(),
            window.localStorage && localStorage.setItem("autoSaveTitle_" + location.pathname + location.search, e(this).val())
        }),
        t.change(function() {
            "" !== e.trim(t.getVal()) && i.change(),
            window.localStorage && window.localStorage.setItem("autoSaveContent_" + location.pathname + location.search, t.getVal())
        }),
        e("#dropIt").click(function() {
            e.post("/api/draft", {
                "do": "delete",
                id: e("#draftId").val()
            },
            function(t) {
                0 === t.status ? (a.html("已舍弃"), e("#draftId").val(""), window.localStorage && localStorage.removeItem("autoSaveContent_" + location.pathname), window.localStorage && localStorage.removeItem("autoSaveTitle_" + location.pathname), window.localStorage && localStorage.removeItem("autoSaveTag_" + location.pathname)) : a.html("舍弃失败"),
                e("#dropIt").addClass("hidden")
            })
        })
    },
    r.prototype.change = function() {
        a.html("保存中...").removeClass("hidden"),
        e("#dropIt").addClass("hidden"),
        clearTimeout(n),
        n = setTimeout(function() {
            i.save()
        },
        4e3)
    },
    r.prototype.save = function() {
        var t = this;
        e("#publishIt").attr("disabled", "disabled"),
        e.post("/api/draft", new t.form,
        function(t) {
            e("#publishIt").removeAttr("disabled"),
            0 === t.status ? (a.html("已保存草稿"), e("#dropIt").data("id", t.data).removeClass("hidden"), e("#draftId").val(t.data), window.localStorage && (window.localStorage.removeItem("autoSaveContent_" + location.pathname + location.search), window.localStorage.removeItem("autoSaveTitle_" + location.pathname + location.search))) : a.html("保存失败")
        })
    },
    new r
})

以上是 SF 的源码,从源码上来看,其实就是在 textarea 发生 change 的时候发送一个 post 而已。等到页面关闭的时候再保存这样不能保证实时性啦,有时候页面崩溃什么的完全没办法的诶,所以还是得定时操作。本地的话 SF 也是有存一份的,但是如果光是本地的话也不行啊,这样并不能保证用户多点登陆的草稿问题诶,所以还是要发送 post 存到服务器上。

Saerdna answered 9 years, 9 months ago

onbeforeunload 的时候太晚了,况且不是任何情况下都会触发。
每秒把所有文本框内容保存到localStorage里吧。


 localStorage[key]=value

香党御姐控 answered 9 years, 9 months ago

Your Answer