Le 25 juil. 2006 à 6:18, Matthew Raymond a écrit :

   What I don't understand about this whole "unchecked value" issue is
why this is even necessary. The status of a check box is a binary value.
If no value is returned, the server can simply assume the unchecked
value. In fact, the server could initially set a string to the unchecked value, then replace it with a checked value if one is returned. This has
always been the case, and won't cause any real hardship if we continue
to only allow a checked value for on to be sent to the server.

In a web application, I have a list of checkbox which looks like that:

    <table>
<tr><th>Activated </th><th>Element </ th></tr> <tr><td><input type="checkbox" name="e1"></td><td>Element 1</ td></tr> <tr><td><input type="checkbox" name="e2"></td><td>Element 2</ td></tr> <tr><td><input type="checkbox" name="e3"></td><td>Element 3</ td></tr> <tr><td><input type="checkbox" name="e4"></td><td>Element 4</ td></tr>
    </table>
    <input type="submit">

Now, each time someone submits the form, every element's "activated" status is set to the corresponding checkbox value. In an ideal world, I would simply loop over each element in my database and check if the corresponding input is defined or not to set the right value.

But things are not that simple: someone else, using a different browser, could have added a bunch of new elements to the list since the the above markup was sent. So when the user submits this, if I simply loop over each element in my database I'll surely deactivate any newly added element that was not present it that list. Obviously, only the checkboxes the user can see should be altered.

As of how necessary the new feature is: I suppose it isn't really since you can always use a hidden field to indicate the presence or the absence of an element. Adding a hidden input isn't very elegant, but is backward compatible.

By contrast, if we allow an unchecked value to be sent to the server,
server software developers will have to deal with both nothing being
sent AND a unchecked value being sent, because they will still have to
support legacy clients. You might argue that Javascript can handle
legacy browsers, but then you create a dependency on scripting while you still have to perform a more complicated form of server-side validation
to avoid potential security problems.

Ric's proposal wasn't very backward compatible. Mine, the "value- unchecked" attribute, preserve the old behaviour, unless you add the attribute. I suppose the best backward-compatible solution may be to continue to use a hidden input until HTML4 browsers fades out.

Remember, if only the checked value is returned, then the server- side code can test for its mere existence and use the resulting boolean value
to determine whether to use the checked or unchecked string. Once you
have a value returned for the unchecked state, you have to evaluate the string to determine the state of the control, rather than simply testing
for its existence.

Always having a value returned inform the server there was a checkbox on the user side when the form was submitted. Adding fields to a form inside the browser using JavaScript or HTML5's repeating model may be a prime example of a case where you absolutely need to know the checkbox was there. But again, I suppose it can be solved with hidden fields too.

(Actually, when you consider that server-side validation needs to be
performed to ensure that improper values are not returned by a check
box, one has to wonder why you'd even bother with allowing values other than "on" to be returned. Anyone have a scenario where the actual string
returned is of any use?)

I think this is pretty common, if only because of PHP. If you receive different inputs with the same name which ends with empty brackets, PHP will automatically build an array for it. So you could have this:

    <input type="checkbox" name="attr[]" value="bold" checked>
    <input type="checkbox" name="attr[]" value="italic" checked>
    <input type="checkbox" name="attr[]" value="superscript">
    <input type="checkbox" name="attr[]" value="subscript" checked>

and automatically get a PHP array like this one:

    $_POST['attr'] = array("bold", "italic", "subscript");

Also, I was wondering if we could add an indeterminate state to checkboxes, like the datagrid has [1]. In this case, a third state would be needed... maybe from a "value-indeterminate" attribute?

 [1]: http://www.whatwg.org/specs/web-apps/current-work/#indeterminate


Michel Fortin
[EMAIL PROTECTED]
http://www.michelf.com/


Reply via email to