JavaScript:隐藏字段的真实表单重置

时间:2010-04-01 10:13:57

标签: javascript forms reset

不幸的是,form.reset()函数不会重置表单的隐藏输入。 签入FF3和Chromium。

是否有人知道如何对隐藏字段进行重置?

10 个答案:

答案 0 :(得分:26)

似乎最简单的方法是使用 display:none 文本字段而不是隐藏字段。 在这种情况下,定期默认重置过程。

答案 1 :(得分:13)

不幸的是,这是正确的as per the standard。一个糟糕的规格疣IMO。尽管如此,IE提供了具有可重置defaultValue的隐藏字段。请参阅this discussion:它不会(唉)在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,一个紧随其后的<!-- comment -->来读取值,显式的其他JS信息,或者额外的隐藏字段只是为了保存默认值。

无论采用何种方法,都必须弄乱HTML;它不能在文档就绪时由脚本创建,因为某些浏览器已经用代码执行时记住的值(从重新加载或按下后退按钮)覆盖了字段的值。

答案 2 :(得分:6)

另一个答案,万一有人来这里寻找一个。 在页面加载后序列化表单并使用这些值稍后重置隐藏字段:

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];
    });

}

答案 3 :(得分:4)

我发现在加载文档时设置默认值更容易,然后捕获重置并将隐藏的小狗重置回其原始值。例如,

//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);
     }
  });
}

希望这可以帮助某人:)

答案 4 :(得分:1)

你可以使用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"属性中。

答案 5 :(得分:0)

创建一个按钮并将JavaScript添加到清除字段的onClick事件中。

那就是说,我很好奇你为什么要重置这些字段。通常,它们包含内部数据。如果我在代码中清除它们,表单的帖子将失败(例如在用户输入新数据并尝试提交表单之后)。

[编辑]我误解了你的问题。如果您担心某人可能会篡改隐藏字段中的值,则无法重置它们。例如,您可以在表单上调用reset(),但不能在表单中的字段上调用。

您可以认为可以将值保存在JavaScript文件中并使用它来重置值,但是当用户可以篡改隐藏字段时,他也可以篡改JavaScript。

因此,从安全的角度来看,如果您需要重置隐藏字段,请首先避免它们,并将信息保存在服务器上的会话中。

答案 6 :(得分:0)

我如何做到这一点就是在隐藏字段的change事件上放置一个事件监听器。在该侦听器函数中,您可以将初始值保存到DOM元素存储(mootoolsjquery),然后侦听表单的重置事件以恢复存储在隐藏表单字段存储中的初始值

答案 7 :(得分:0)

这样做:

$("#form input:hidden").val('').trigger('change');

答案 8 :(得分:0)

$('#form :reset').on('click',function(e)({
    e.preventDefault();
    e.stopImmediatePropagation();
    $("#form input:hidden,#form :text,#form textarea").val('');
});

对于select,checkbox,radio,你最好知道(保持)默认值,在那个事件处理程序中,你将它们设置为默认值。

答案 9 :(得分:0)

您可以在下面的行中重置隐藏的输入字段值,只需更改表单ID即可,而不是frmForm

$("#frmForm input:hidden").val(' ');