如何实现 segmentfault 提问题不保存会自动创建一份草稿
由于有多个表单需要填写,每个表单未填写完成就要保存到草稿
初步想法是将表单url和表单数据记录下来,在触发onbeforeunload时间的时候保存下来,至于数据,我想存储在本地,这样减轻了服务器的压力 在onload的时候读取这些数据
普崔希德叫兽
9 years, 9 months ago
Answers
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