Do checkbox inputs only post data if they're checked?

后端 未结 12 754
盖世英雄少女心
盖世英雄少女心 2020-11-22 08:04

Is it standard behaviour for browsers to only send the checkbox input value data if it is checked upon form submission?

And if no value data is supplied, is the defa

相关标签:
12条回答
  • 2020-11-22 08:41

    Checkboxes are posting value 'on' if and only if the checkbox is checked. Insted of catching checkbox value you can use hidden inputs

    JS:

    var chk = $('input[type="checkbox"]');
        chk.each(function(){
            var v = $(this).attr('checked') == 'checked'?1:0;
            $(this).after('<input type="hidden" name="'+$(this).attr('rel')+'" value="'+v+'" />');
        });
    
    chk.change(function(){ 
            var v = $(this).is(':checked')?1:0;
            $(this).next('input[type="hidden"]').val(v);
        });
    

    HTML:

    <label>Active</label><input rel="active" type="checkbox" />
    
    0 讨论(0)
  • 2020-11-22 08:45

    I resolved the problem with this code:

    HTML Form

    <input type="checkbox" id="is-business" name="is-business" value="off" onclick="changeValueCheckbox(this)" >
    <label for="is-business">Soy empresa</label>
    

    and the javascript function by change the checkbox value form:

    //change value of checkbox element
    function changeValueCheckbox(element){
       if(element.checked){
        element.value='on';
      }else{
        element.value='off';
      }
    }
    

    and the server checked if the data post is "on" or "off". I used playframework java

            final Map<String, String[]> data = request().body().asFormUrlEncoded();
    
            if (data.get("is-business")[0].equals('on')) {
                login.setType(new MasterValue(Login.BUSINESS_TYPE));
            } else {
                login.setType(new MasterValue(Login.USER_TYPE));
            }
    
    0 讨论(0)
  • 2020-11-22 08:50

    From HTML 4 spec, which should be consistent across almost all browsers:

    http://www.w3.org/TR/html401/interact/forms.html#checkbox

    Checkboxes (and radio buttons) are on/off switches that may be toggled by the user. A switch is "on" when the control element's checked attribute is set. When a form is submitted, only "on" checkbox controls can become successful.

    Successful is defined as follows:

    A successful control is "valid" for submission. Every successful control has its control name paired with its current value as part of the submitted form data set. A successful control must be defined within a FORM element and must have a control name.

    0 讨论(0)
  • 2020-11-22 08:51

    In HTML, each <input /> element is associated with a single (but not unique) name and value pair. This pair is sent in the subsequent request (in this case, a POST request body) only if the <input /> is "successful".

    So if you have these inputs in your <form> DOM:

    <input type="text"     name="one"   value="foo"                        />
    <input type="text"     name="two"   value="bar"    disabled="disabled" />
    <input type="text"     name="three" value="first"                      />
    <input type="text"     name="three" value="second"                     />
    
    <input type="checkbox" name="four"  value="baz"                        />
    <input type="checkbox" name="five"  value="baz"    checked="checked"   />
    <input type="checkbox" name="six"   value="qux"    checked="checked" disabled="disabled" />
    <input type="checkbox" name=""      value="seven"  checked="checked"   />
    
    <input type="radio"    name="eight" value="corge"                      />
    <input type="radio"    name="eight" value="grault" checked="checked"   />
    <input type="radio"    name="eight" value="garply"                     />
    

    Will generate these name+value pairs which will be submitted to the server:

    one=foo
    three=first
    three=second
    five=baz
    eight=grault
    

    Notice that:

    • two and six were excluded because they had the disabled attribute set.
    • three was sent twice because it had two valid inputs with the same name.
    • four was not sent because it is a checkbox that was not checked
    • six was not sent despite being checked because the disabled attribute has a higher precedence.
    • seven does not have a name="" attribute sent, so it is not submitted.

    With respect to your question: you can see that a checkbox that is not checked will therefore not have its name+value pair sent to the server - but other inputs that share the same name will be sent with it.

    Frameworks like ASP.NET MVC work around this by (surreptitiously) pairing every checkbox input with a hidden input in the rendered HTML, like so:

    @Html.CheckBoxFor( m => m.SomeBooleanProperty )
    

    Renders:

    <input type="checkbox" name="SomeBooleanProperty" value="true" />
    <input type="hidden"   name="SomeBooleanProperty" value="false" />
    

    If the user does not check the checkbox, then the following will be sent to the server:

    SomeBooleanProperty=false
    

    If the user does check the checkbox, then both will be sent:

    SomeBooleanProperty=true
    SomeBooleanProperty=false
    

    But the server will ignore the =false version because it sees the =true version, and so if it does not see =true it can determine that the checkbox was rendered and that the user did not check it - as opposed to the SomeBooleanProperty inputs not being rendered at all.

    0 讨论(0)
  • 2020-11-22 08:52

    If checkbox isn't checked then it doesn't contribute to the data sent on form submission.

    HTML5 section 4.10.22.4 Constructing the form data set describes the way form data is constructed:

    If any of the following conditions are met, then skip these substeps for this element: [...]

    The field element is an input element whose type attribute is in the Checkbox state and whose checkedness is false.

    and then the default valued on is specified if value is missing:

    Otherwise, if the field element is an input element whose type attribute is in the Checkbox state or the Radio Button state, then run these further nested substeps:

    If the field element has a value attribute specified, then let value be the value of that attribute; otherwise, let value be the string "on".

    Thus unchecked checkboxes are skipped during form data construction.

    Similar behavior is required under HTML4. It's reasonable to expect this behavior from all compliant browsers.

    0 讨论(0)
  • 2020-11-22 08:54

    Having the same problem with unchecked checkboxes that will not be send on forms submit, I came out with a another solution than mirror the checkbox items.

    Getting all unchecked checkboxes with

    var checkboxQueryString;
    
    $form.find ("input[type=\"checkbox\"]:not( \":checked\")" ).each(function( i, e ) {
      checkboxQueryString += "&" + $( e ).attr( "name" ) + "=N"
    });
    
    0 讨论(0)
提交回复
热议问题