使用jQuery重置多阶段表单

时间:2009-03-25 04:40:59

标签: jquery reset html-form

我有一个带有标准复位按钮的表格,因此编码:

<input type="reset" class="button standard" value="Clear" />

麻烦的是,表示形式是多阶段排序,所以如果用户填写一个舞台&amp;然后返回,单击“清除”按钮时,各个字段的“记住”值将不会重置。

我认为附加一个jQuery函数来遍历所有字段并“手动”清除它们就可以了。我已经在表单中使用了jQuery,但我只是刚刚起步到速度和所以我不知道如何解决这个问题,除了通过ID单独引用每个字段,这看起来效率不高。

TIA提供任何帮助。

30 个答案:

答案 0 :(得分:494)

于2012年3月更新。

所以,在我最初回答这个问题两年后,我回过头来看它已经变成了一个大混乱。我觉得现在是时候回到它,让我的答案真正正确,因为它是最受欢迎的+接受。

为了记录,Titi的答案是错误的,因为它不是原始海报所要求的 - 使用原生重置()方法重置表单是正确的,但这个问题是试图清除表格如果您以这种方式重置它,将记住保留在表单中的记忆值。这就是需要“手动”复位的原因。我假设大多数人都是通过谷歌搜索结束这个问题而且真的在寻找reset()方法,但它不适用于OP所讨论的特定情况。

我的原始答案是:

// not correct, use answer below
$(':input','#myform')
.not(':button, :submit, :reset, :hidden')
.val('')
.removeAttr('checked')
.removeAttr('selected');

这可能适用于很多情况,包括OP,但正如评论和其他答案中所指出的,将清除任何值属性中的radio / checkbox元素。

更强正确答案(但不完美)是:

function resetForm($form) {
    $form.find('input:text, input:password, input:file, select, textarea').val('');
    $form.find('input:radio, input:checkbox')
         .removeAttr('checked').removeAttr('selected');
}

// to call, use:
resetForm($('#myform')); // by id, recommended
resetForm($('form[name=myName]')); // by name

使用:text:radio等选择器本身被jQuery认为是不好的做法,因为它们最终会对*:text进行评估,这使得它需要的时间比它应该长得多。我更喜欢白名单方法,并希望我在原来的答案中使用它。无论如何,通过指定选择器的input部分,加上表单元素的缓存,这应该使它成为表现最佳的答案。

如果人们对select元素的默认值不是具有空白值的选项,那么这个答案可能仍有一些缺陷,但它肯定是通用的,因为它将需要在一个案例中处理 - 基础。

答案 1 :(得分:390)

来自http://groups.google.com/group/jquery-dev/msg/2e0b7435a864beea

$('#myform')[0].reset();
如果你有这样的输入,

设置myinput.val('')可能无法模拟“重置”100%:

<input name="percent" value="50"/>

例如,对默认值为50的输入调用myinput.val('')会将其设置为空字符串,而调用myform.reset()会将其重置为初始值50。

答案 2 :(得分:48)

Paolo接受的答案存在很大问题。考虑:

$(':input','#myform')
 .not(':button, :submit, :reset, :hidden')
 .val('')
 .removeAttr('checked')
 .removeAttr('selected');

.val('') 行也会清除分配给复选框和单选按钮的任何value。所以,如果(像我一样)你做这样的事情:

<input type="checkbox" name="list[]" value="one" />
<input type="checkbox" name="list[]" value="two" checked="checked" />
<input type="checkbox" name="list[]" value="three" />

使用接受的答案会将您的输入转换为:

<input type="checkbox" name="list[]" value="" />
<input type="checkbox" name="list[]" value="" />
<input type="checkbox" name="list[]" value="" />

哎呀 - 我正在使用那个值!

这是一个修改后的版本,它会保留您的复选框和广播值:

// Use a whitelist of fields to minimize unintended side effects.
$('INPUT:text, INPUT:password, INPUT:file, SELECT, TEXTAREA', '#myFormId').val('');  
// De-select any checkboxes, radios and drop-down menus
$('INPUT:checkbox, INPUT:radio', '#myFormId').removeAttr('checked').removeAttr('selected');

答案 3 :(得分:15)

jQuery插件

我创建了一个jQuery插件,因此我可以在任何需要的地方轻松使用它:

jQuery.fn.clear = function()
{
    var $form = $(this);

    $form.find('input:text, input:password, input:file, textarea').val('');
    $form.find('select option:selected').removeAttr('selected');
    $form.find('input:checkbox, input:radio').removeAttr('checked');

    return this;
}; 

所以现在我可以通过调用它来使用它:

$('#my-form').clear();

答案 4 :(得分:14)

清除表单有点棘手,并不像看起来那么简单。

建议您使用jQuery form plugin并使用其clearForm or resetForm功能。 它负责大多数角落案件。

答案 5 :(得分:14)

的document.getElementById( 'FRM')。复位()

答案 6 :(得分:13)

我通常会这样做:

$('#formDiv form').get(0).reset()

$('#formId').get(0).reset()

答案 7 :(得分:5)

考虑使用validation plugin - 太棒了!重置表单很简单:

var validator = $("#myform").validate();
validator.resetForm();

答案 8 :(得分:4)

基本上 none 提供的解决方案让我很开心。 正如一些人指出的那样,他们清空表格而不是重置表格。

但是,有一些javascript属性可以提供帮助:

  • 文本字段的defaultValue
  • defaultChecked for checkboxes和单选按钮
  • 默认选择选项

这些存储了加载页面时字段的值。

编写jQuery插件现在变得微不足道了: (对于不耐烦的......这是一个演示http://jsfiddle.net/kritzikratzi/N8fEF/1/

插件代码

(function( $ ){
    $.fn.resetValue = function() {  
        return this.each(function() {
            var $this = $(this); 
            var node = this.nodeName.toLowerCase(); 
            var type = $this.attr( "type" ); 

            if( node == "input" && ( type == "text" || type == "password" ) ){
                this.value = this.defaultValue; 
            }
            else if( node == "input" && ( type == "radio" || type == "checkbox" ) ){
                this.checked = this.defaultChecked; 
            }
            else if( node == "input" && ( type == "button" || type == "submit" || type="reset" ) ){ 
                // we really don't care 
            }
            else if( node == "select" ){
                this.selectedIndex = $this.find( "option" ).filter( function(){
                    return this.defaultSelected == true; 
                } ).index();
            }
            else if( node == "textarea" ){
                this.value = this.defaultValue; 
            }
            // not good... unknown element, guess around
            else if( this.hasOwnProperty( "defaultValue" ) ){
                this.value = this.defaultValue; 
            }
            else{
                // panic! must be some html5 crazyness
            }
        });
    }
} )(jQuery);

使用

// reset a bunch of fields
$( "#input1, #input2, #select1" ).resetValue(); 

// reset a group of radio buttons
$( "input[name=myRadioGroup]" ).resetValue(); 

// reset all fields in a certain container
$( "#someContainer :input" ).resetValue(); 

// reset all fields
$( ":input" ).resetValue(); 

// note that resetting all fields is better with the javascript-builtin command: 
$( "#myForm" ).get(0).reset(); 

一些笔记......

  • 我没有查看新的html5表单元素,有些可能需要特殊处理,但同样的想法应该工作。
  • 元素需要直接引用。即$( "#container" ).resetValue()将不起作用。始终使用$( "#container :input" )代替。
  • 如上所述,这是一个演示:http://jsfiddle.net/kritzikratzi/N8fEF/1/

答案 9 :(得分:4)

如果没有jQuery,你可能会发现这实际上更容易解决。

在常规JavaScript中,这很简单:

document.getElementById('frmitem').reset();

我尽量记住,虽然我们使用jQuery来增强和加速编码,但有时它实际上并不快。在这些情况下,使用其他方法通常会更好。

答案 10 :(得分:4)

我对Francis Lewis' nice solution略有不同。他的解决方案没有做的是将下拉选项设置为空白。 (我认为,当大多数人想要&#34;清除&#34;时,他们可能希望将所有值都清空。)这个值是.find('select').prop("selectedIndex", -1)

$.fn.clear = function()
{
    $(this).find('input')
            .filter(':text, :password, :file').val('')
            .end()
            .filter(':checkbox, :radio')
                .removeAttr('checked')
            .end()
        .end()
    .find('textarea').val('')
        .end()
    .find('select').prop("selectedIndex", -1)
        .find('option:selected').removeAttr('selected')
    ;
    return this;
};

答案 11 :(得分:4)

我觉得这很有效。

$(":input").not(":button, :submit, :reset, :hidden").each( function() {
    this.value = this.defaultValue;     
});

答案 12 :(得分:4)

这是让你入门的东西

$('form') // match your correct form 
.find('input[type!=submit], input[type!=reset]') // don't reset submit or reset
.val(''); // set their value to blank

当然,如果你有复选框/单选按钮,则需要修改它以包含它们并设置.attr({'checked': false});

修改 Paolo's answer更简洁。我的回答更加冗长,因为我不知道:input选择器,也没想过简单地删除checked属性。

答案 13 :(得分:2)

只需使用jQuery Trigger event,就像这样:

$('form').trigger("reset");

这将重置复选框,单选按钮,文本框等...基本上它会将您的表单转换为默认状态。只需将#ID, Class, element放在jQuery选择器内。

答案 14 :(得分:2)

修改$(document).ready()情况的最多投票答案:

$('button[type="reset"]').click(function(e) {
    $form = $(this.form);
    $form.find('input:text, input:password, input:file, select, textarea').val('');
    $form.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
    e.preventDefault();
});

答案 15 :(得分:2)

我通常会在表单中添加一个隐藏的重置按钮。 只需要:     $( '#复位')点击()。

答案 16 :(得分:1)

我只是PHP中的中间人,有点懒于深入研究像JQuery这样的新语言,但这不是以下简单而优雅的解决方案吗?

<input name="Submit1" type="submit" value="Get free quote" />
<input name="submitreset" type="submit" value="Reset" />

看不出有两个提交按钮的原因,只是出于不同的目的。 然后简单地说:

if ($_POST['submitreset']=="Reset") {
$_source = "--Choose language from--";
$_target = "--Choose language to--"; }

您只需将值重新定义为默认值即可。

答案 17 :(得分:1)

我正在使用Paolo Bergantino解决方案,这个解决方案非常棒,但很少进行调整......特别是使用表单名称而不是id。

例如:

function jqResetForm(form){
   $(':input','form[name='+form+']')
   .not(':button, :submit, :reset, :hidden')
   .val('')
   .removeAttr('checked')
   .removeAttr('selected');
}

现在,当我想使用它时,可以做

<span class="button" onclick="jqResetForm('formName')">Reset</span>

如您所见,这可以使用任何形式,因为我使用css样式创建按钮,单击时页面不会刷新。再次感谢Paolo的意见。唯一的问题是如果我在表单中有默认值。

答案 18 :(得分:1)

我使用下面的解决方案,它适用于我(将传统的javascript与jQuery混合)

$("#myformId").submit(function() {
    comand="window.document."+$(this).attr('name')+".reset()";
    setTimeout("eval(comando)",4000);
})

答案 19 :(得分:1)

这对我有用,pyrotex回答没有'重置选择字段,拿走他的,这里'我的编辑:

// Use a whitelist of fields to minimize unintended side effects.
$(':text, :password, :file', '#myFormId').val('');  
// De-select any checkboxes, radios and drop-down menus
$(':input,select option', '#myFormId').removeAttr('checked').removeAttr('selected');
//this is for selecting the first entry of the select
$('select option:first', '#myFormId').attr('selected',true);

答案 20 :(得分:0)

<script type="text/javascript">
$("#edit_name").val('default value');
$("#edit_url").val('default value');
$("#edit_priority").val('default value');
$("#edit_description").val('default value');
$("#edit_icon_url option:selected").removeAttr("selected");
</script>

答案 21 :(得分:0)

所有这些答案都很好,但绝对最简单的方法是使用假复位,即使用链接和重置按钮。

只需添加一些CSS即可隐藏真正的重置按钮。

input[type=reset] { visibility:hidden; height:0; padding:0;}

然后在您的链接上添加如下

<a href="javascript:{}" onclick="reset.click()">Reset form</a>

<input type="reset" name="reset" id="reset" /><!--This input button is hidden-->

希望这有帮助! 甲

答案 22 :(得分:0)

这里有复选框的刷新并选择:

$('#frm').find('input:text, input:password, input:file, textarea').val('');
$('#frm').find('input:radio, input:checkbox').attr("checked",false).checkboxradio("refresh");
$('#frm').find('select').val('').selectmenu('refresh');

答案 23 :(得分:0)

我遇到了同样的问题,保罗的帖子帮助了我,但我需要调整一件事。我的带有advanced advancedindexsearch的表单只包含输入字段并从会话中获取值。出于某种原因,以下内容对我不起作用:

$("#advancedindexsearch").find("input:text").val("");

如果我在此之后发出警告,我会看到正确删除的值,但之后它们会再次被替换。我仍然不知道如何或为什么,但以下一行确实为我做了诀窍:

$("#advancedindexsearch").find("input:text").attr("value","");

答案 24 :(得分:0)

Paolo的答案没有考虑日期选择器,请将其添加到:

$form.find('input[type="date"]').val('');

答案 25 :(得分:0)

我对Paolo Bergantino的原始答案做了一些改进

function resetFormInputs(context) {
    jQuery(':input', context)
    .removeAttr('checked')
    .removeAttr('selected')
    .not(':button, :submit, :reset, :hidden')
    .each(function(){
         jQuery(this).val(jQuery(this).prop('defautValue'));
    });
}

通过这种方式,我可以将任何上下文元素传递给函数。我可以重置整个表单或仅重置某组字段,例如:

resetFormInputs('#form-id'); // entire form
resetFormInputs('.personal-info'); // only the personal info field set

另外,保留输入的默认值。

答案 26 :(得分:0)

这是我的解决方案,它也适用于新的html5输入类型:

/**
 * removes all value attributes from input/textarea/select-fields the element with the given css-selector
 * @param {string} ele css-selector of the element | #form_5
 */
function clear_form_elements(ele) {
    $(ele).find(':input').each(function() {
        switch (this.type) {
            case 'checkbox':
            case 'radio':
                this.checked = false;
            default:
                $(this).val('');
                break;
        }
    });
}

答案 27 :(得分:0)

我在一个相当大的表单(50多个字段)上使用的方法是使用AJAX重新加载表单,基本上是回调服务器并返回带有默认值的字段。这比使用JS获取每个字段然后将其设置为默认值要容易得多。它还允许我将默认值保存在一个位置 - 服务器的代码。在这个网站上,还有一些不同的默认值,具体取决于帐户的设置,因此我不必担心将这些发送给JS。我必须解决的唯一一个小问题是在AJAX调用之后需要初始化的一些建议字段,但不是什么大问题。

答案 28 :(得分:0)

补充已接受的答案,如果您使用SELECT2插件,则需要调出select2脚本来进行更改,这是所有select2字段:

function resetForm(formId){
        $('#'+formId).find('input:text, input:password, input:file, select, select2, textarea').val('');
        $('#'+formId).find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
        $('.select2').select2();
    }

答案 29 :(得分:-1)

$(this).closest('form').find('input,textarea,select').not(':image').prop('disabled', true);