不幸的是 form.reset() 函数不会重置表单的隐藏输入。签入 FF3 和 Chromium。
有谁知道如何对隐藏字段进行重置?
似乎最简单的方法是使用display: none文本字段而不是隐藏字段。在这种情况下,默认重置过程会定期进行。
不幸的是,按照标准,这是正确的。一个糟糕的规格疣 IMO。尽管如此,IE 还是为隐藏字段提供了可重置的功能defaultValue
。请参阅此讨论:它不会(唉)在 HTML5 中发生变化。
(幸运的是,很少需要重置表单。作为 UI 功能,它通常不受欢迎。)
由于您根本无法获得value
属性的原始值,因此您必须将其复制到另一个属性中并获取它。例如。:
<form id="f">
<input type="hidden" name="foo" value="bar" class="value=bar"/>
function resetForm() {
var f= document.getElementById('f');
f.reset();
f.elements.foo.value= Element_getClassValue(f.elements.foo, 'value');
}
function Element_getClassValue(el, classname) {
var prefix= classname+'=';
var classes= el.className.split(/\s+/);
for (var i= classes.length; i-->0;)
if (classes[i].substring(0, prefix.length)===prefix)
return classes[i].substring(prefix.length);
return '';
}
偷运该值的替代方法可能包括 HTML5 data
、另一个备用属性(如)、从其读取值title
的紧随其后、显式附加 JS 信息或仅用于保存默认值的额外隐藏字段。<!-- comment -->
无论采用哪种方法,都必须使 HTML 变得混乱;它不能在文档准备就绪时由脚本创建,因为在代码执行时,某些浏览器已经用记住的值(来自重新加载或后退按钮)覆盖了字段的值。
另一个答案,以防有人来这里寻找。页面加载后序列化表单并使用这些值稍后重置隐藏字段:
var serializedForm = $('#myForm').serialize();
然后,重置表单:
function fullReset(){
$('#myForm').reset(); // resets everything except hidden fields
var formFields = decodeURIComponent(serializedForm).split('&'); //split up the serialized form into variable pairs
//put it into an associative array
var splitFields = new Array();
for(i in formFields){
vals= formFields[i].split('=');
splitFields[vals[0]] = vals[1];
}
$('#myForm').find('input[type=hidden]').each(function(){
this.value = splitFields[this.name];
});
}
我发现在加载文档时设置默认值然后捕获重置并将隐藏的小狗重置回其原始值更容易。例如,
//fix form reset (hidden fields don't get reset - this will fix that pain in the arse issue)
$( document ).ready(function() {
$("#myForm").find("input:hidden").each(function() {
$(this).data("myDefaultValue", $(this).val());
});
$("#myForm").off("reset.myarse");
$("#myForm").on("reset.myarse", function() {
var myDefaultValue = $(this).data("myDefaultValue");
if (myDefaultValue != null) {
$(this).val(myDefaultValue);
}
});
}
希望这可以帮助某人:)
您可以使用 jQuery - 这将清空隐藏字段:
$('form').on('reset', function() {
$("input[type='hidden']", $(this)).val('');
});
提示:只需确保您没有重置 csrf 令牌字段或任何其他不应清空的内容。如果需要,您可以缩小元素的规格。
如果您想将该字段重置为默认值,您可以使用(未测试):
$('form').on('reset', function() {
$("input[type='hidden']", $(this)).each(function() {
var $t = $(this);
$t.val($t.data('defaultvalue'));
});
});
并将默认值保存在data-defaultvalue="Something"
属性中。
$('#form :reset').on('click',function(e)({
e.preventDefault();
e.stopImmediatePropagation();
$("#form input:hidden,#form :text,#form textarea").val('');
});
对于 select、checkbox、radio,最好知道(保持)默认值,并在该事件处理程序中将它们设置为默认值。
创建一个按钮并将 JavaScript 添加到onClick
清除字段的事件中。
也就是说,我很好奇你为什么要重置这些字段。通常,它们包含内部数据。如果我在我的代码中清除它们,则表单的发布将失败(例如,在用户输入新数据并尝试提交表单之后)。
[编辑] 我误解了你的问题。如果您担心有人可能篡改隐藏字段中的值,则无法重置它们。例如,您可以reset()
在表单上调用,但不能在表单中的字段上调用。
您可能认为您可以将值保存在 JavaScript 文件中并使用它来重置值,但是当用户可以篡改隐藏字段时,他也可以篡改 JavaScript。
所以从安全的角度来看,如果你需要重置隐藏字段,那么首先要避免它们,并将信息保存在服务器上的会话中。
这将做:
$("#form input:hidden").val('').trigger('change');
您可以使用下面的行重置隐藏的输入字段值,您只需要更改表单 id 而不是frmForm
.
$("#frmForm input:hidden").val(' ');