我有一个选项卡式的html表单,在从一个选项卡导航到另一个选项卡时,当前选项卡的数据被持久化(在DB上),即使数据没有变化。
我想只有在编辑表单时才进行持久性调用。表单可以包含任何类型的控件。不需要通过键入一些文本来弄脏表单,但在日历控件中选择日期也符合条件。
实现此目的的一种方法是在默认情况下以只读模式显示表单,并具有“编辑”按钮,如果用户单击编辑按钮,则调用DB(再次,无论数据是否被修改。这是对当前现有内容的更好改进)。
我想知道如何写一个通用的JavaScript函数,将检查是否有任何控件的值已被修改?
9条答案
按热度按时间uyhoqukh1#
在纯javascript中,这不是一件容易的事情,但jQuery使它变得非常容易:
然后在保存之前,您可以检查它是否已更改:
在上面的示例中,表单的id等于“myform”。
如果你在很多形式上需要它,你可以很容易地把它变成一个插件:
然后你可以简单地说:
并检查表单是否已更改:
mwg9r5ms2#
我不确定我是否理解了你的问题,但是addEventListener呢?如果你不太关心IE8的支持,这应该没问题。下面的代码对我来说是有效的:
flvlnr443#
如果JQuery是不可能的。在Google上快速搜索发现MD5和SHA1哈希算法的Javascript实现。如果你愿意,你可以连接所有表单输入并对其进行哈希,然后将该值存储在内存中。当用户完成时。连接所有值并再次哈希。比较2个哈希。如果它们相同,则用户没有更改任何表单字段。如果它们不同,则用户可以将其保存在内存中。有些东西被编辑了,你需要调用你的持久性代码。
gzszwxb44#
另一种实现方法是序列化表单:
smtd7mpg5#
表单更改可以在没有jQuery的原生JavaScript中轻松检测到:
initChangeDetection()
可以在页面的整个生命周期中安全地多次调用:See Test on JSBin对于不支持新的箭头/数组函数的旧浏览器:
83qze16e6#
下面是我如何做到的(不使用jQuery)。
在我的例子中,我希望一个特定的表单元素不被计算在内,因为它是触发检查的元素,因此总是会发生变化。异常元素名为'reporting_period',并硬编码在函数'hasFormChanged()'中。
要进行测试,请让一个元素调用函数“changeReportingPeriod()”,您可能希望将其命名为其他名称。
重要提示:当值被设置为它们的原始值时(通常在页面加载时,但在我的情况下不是这样),必须调用setInitialValues()。
注意事项:我并不认为这是一个优雅的解决方案,事实上我并不相信优雅的JavaScript解决方案。(就好像在JavaScript中是可能的一样)。我在写JavaScript的时候根本不关心文件大小,因为这就是gzip的作用,试图编写更紧凑的JavaScript代码总是会导致无法忍受的维护问题。我不会道歉,不会后悔,也不会拒绝辩论。这是JavaScript。对不起,我必须把这一点说清楚,以便说服自己,我应该费心发帖。高兴点!:)
e4yzc0pl7#
下面是原生JavaScript中的polyfill方法演示,它使用
FormData()
API来检测创建、更新和删除的表单条目。您可以使用HTMLFormElement#isChanged
检查是否有任何更改,并使用HTMLFormElement#changes
获取包含重置表单差异的对象(假设它们没有被输入名称屏蔽):stszievb8#
我真的很喜欢上面Teekin的贡献,并实现了它。
然而,我已经扩展了它,允许复选框也使用这样的代码:
diffstring只是一个调试工具
4c8rllxm9#
这里是Philippe Leybaert’s answer,所有字段包括
select
,textarea
和input
以及纯JavaScript中的serialize
solution from @nikoskip。它检查值是否真的被更改,而不是恢复到原始状态。
然后你可以简单地说:
并检查表单是否已更改:
示例: