用于“未保存数据”的客户端/ JS框架保护? [英] Client/JS Framework for "Unsaved Data" Protection?
问题描述
我们有一个典型的Web应用程序,它本质上是一个具有大量屏幕的数据输入应用程序,其中一些屏幕具有一定程度的复杂性。我们需要提供标准功能,以确保用户忘记在导航或关闭浏览器之前单击保存按钮,他们会收到警告并可以取消(但仅当存在未保存或脏数据时)。
We have a typical web application that is essentially a data entry application with lots of screens some of which have some degree of complexity. We need to provide that standard capability on making sure if the user forgets to click the "Save" button before navigating away or closing their browser they get a warning and can cancel (but only when there is unsaved or dirty data).
我知道我必须做的事情的基础知识 - 实际上我确信在这些年之前我已经完成了所有工作(与onbeforeunload相关,追踪页面的脏状态等...)但在我开始编码之前,有没有人对已经存在的图书馆(免费或其他)提出一些建议会有所帮助?
I know the basics of what I've got to do-- in fact I'm sure I've done it all before over the years (tie in to onbeforeunload, track the "dirty" state of the page, etc...) but before I embark on coding this YET AGAIN, does anyone have some suggestions for libraries already out there (free or otherwise) that will help out?
推荐答案
其中一个难题:
/**
* Determines if a form is dirty by comparing the current value of each element
* with its default value.
*
* @param {Form} form the form to be checked.
* @return {Boolean} <code>true</code> if the form is dirty, <code>false</code>
* otherwise.
*/
function formIsDirty(form)
{
for (var i = 0; i < form.elements.length; i++)
{
var element = form.elements[i];
var type = element.type;
if (type == "checkbox" || type == "radio")
{
if (element.checked != element.defaultChecked)
{
return true;
}
}
else if (type == "hidden" || type == "password" || type == "text" ||
type == "textarea")
{
if (element.value != element.defaultValue)
{
return true;
}
}
else if (type == "select-one" || type == "select-multiple")
{
for (var j = 0; j < element.options.length; j++)
{
if (element.options[j].selected !=
element.options[j].defaultSelected)
{
return true;
}
}
}
}
return false;
}
另一个:
window.onbeforeunload = function(e)
{
e = e || window.event;
if (formIsDirty(document.forms["someFormOfInterest"]))
{
// For IE and Firefox
if (e)
{
e.returnValue = "You have unsaved changes.";
}
// For Safari
return "You have unsaved changes.";
}
};
全部包装,你得到了什么?
Wrap it all up, and what do you get?
var confirmExitIfModified = (function()
{
function formIsDirty(form)
{
// ...as above
}
return function(form, message)
{
window.onbeforeunload = function(e)
{
e = e || window.event;
if (formIsDirty(document.forms[form]))
{
// For IE and Firefox
if (e)
{
e.returnValue = message;
}
// For Safari
return message;
}
};
};
})();
confirmExitIfModified("someForm", "You have unsaved changes.");
您可能还想更改 beforeunload的注册
事件处理程序使用 LIBRARY_OF_CHOICE
的事件注册。
You'll probably also want to change the registration of the beforeunload
event handler to use LIBRARY_OF_CHOICE
's event registration.
这篇关于用于“未保存数据”的客户端/ JS框架保护?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!