对于初学者,您提供的代码将不起作用,因为this
引用document
而不是input
元素。您需要将代码更新为:
jQuery(function ($) { //aliasing document.ready shortcut, good practice
"use strict";
$('input').data('initial-value', $('input').val());
});
当然,这也可能不会满足您的要求,因为它会将每个输入元素设置为存储第一个输入元素的初始值(.val()
返回第一个匹配元素的值)。
因此,要更新代码以适用于每个元素,您可以使用:
jQuery(function ($) {
"use strict";
$('input').each(function () {
$(this).data('initial-value', $(this).val());
});
});
但是接下来我们需要考虑为什么您首先要费心存储元素的初始值。如果有人用 更改了输入元素的值,$(someElement).val('new value');
则可以通过将其值设置回其[value]
属性来重置输入:
$(someElement).val($(someElement).attr('value'));
另一方面,如果您使用 设置input
元素的值,则说明$(someElement).attr('value', 'new value');
您做错了,并且正在破坏input
元素的状态。reset
按钮依赖于[value]
保留原始状态的属性,因此当 aform
被重置时,输入可以返回到它们的原始状态。
您还提到:
问题是上面没有将input
字段的初始值存储在数据属性initial-value
中。未创建属性。
当您用于访问元素上的数据时,如果存在属性.data()
,它将从属性中提取信息。这对于初始化元素上的数据非常有用。[data-*]
[data-*]
当您使用.data(key, value)
将数据与元素关联时,它将值作为属性存储在元素上;它不会更新属性的值。没有一种方法可以序列化实例化的对象,例如new Foo
可以将其反序列化为最初的方式。
如果您想验证对象的数据是否设置正确,您不能简单地使用 DOM 检查器,您需要实际检查该.data()
特定元素的内容。
有关和之间差异的更多信息.attr()
,.data()
请参阅我对这个相关问题的回答。