- From: Philip Taylor <pjt47@cam.ac.uk>
- Date: Wed, 23 Apr 2008 14:31:33 +0100
- To: Henri Sivonen <hsivonen@iki.fi>
- CC: HTML WG <public-html@w3.org>
Henri Sivonen wrote:
>
> Given the developments in unifying HTML5 and XHTML5 content models after
> WF2 was last revised and the outlook about the role of XHTML5, it would
> make sense to unify the conformance requirement regarding nested forms.
> That is, the spec should make nested forms non-conforming for XHTML5.
I'd like to implement the UI described below - I did it a while ago with
nested forms, and couldn't think of a better way to do it, so either it
would be nice to know a better way or else it would be nice for it to be
conforming.
I want a form UI which looks somewhat like:
__________________
Name [_Whatever_________]
_____ __________________ ________________
Photo | o | [_C:\Documents\..._] [Upload_new_image]
| -|- |
|_/_\_|
_____
Age [_312_]
____________
[Save_details]
where you can select an image file while you're in the middle of the
form, and upload it asynchronously when you click the button. In
particular, the user should get almost-immediate feedback with the
little thumbnail image updating to match what they uploaded, rather than
waiting until they submit the form at the very end; and the entire page
shouldn't submit/reload when they are uploading the photo in the middle,
because that looks ugly and requires more server-side code.
It also needs to work in current common browsers (mostly IE6, IE7, FF2,
preferably Safari 3 and Opera 9), and needs to work nicely in them
rather than degrading to a functional but ugly fallback. (It doesn't
help if there are new features that make this much easier but aren't
widely implemented - I should be able to write code that is conforming
HTML5 and still works in legacy browsers and still does what I want it
to). It doesn't need to work at all when scripting is disabled.
I did this with something like:
<form action="save_details" method="POST">
<table>
<tr><th>Name: <td><input name="name">
<tr><th>Photo: <td>
<img src="current_photo_thumbnail">
<form action="upload_image" method="POST"
enctype="multipart/form-data" target="upload-iframe">
<input type="file" name="photo">
<input type="submit" value="Upload">
</form>
<iframe name="upload-iframe" style="display: none"></iframe>
<tr><th>Age: <td><input name="age">
</table>
<input type="submit" value="Save details">
</form>
(except actually the nested form was inserted by DOM-altering scripts,
because of the HTML parser limitations, but that's not relevant in terms
of whether the document is conforming).
In all the browsers I tested, the 'Upload' button submits only the inner
form (i.e. only the file input), and the submission response is loaded
into the invisible iframe and can run some scripts to notify the user
that it's finished, which is all good.
The 'Save details' button acts slightly differently between browsers. In
(at least) FF2 and Opera 9.2, it submits only the inputs that are in the
outer form and not in the inner form (i.e. it excludes the file input).
In (at least) IE6, it submits all the inputs that are in the outer form
(i.e. including the file input). Since the outer form isn't
multipart/form-data, IE6 submits just the filename and not the file
data, so it doesn't redundantly upload the file data on 'Save changes',
and so that's not a problem. So it seems to work reliably enough between
browsers.
(Demonstration of the browser differences:
http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!doctype%20html%3E%0A%3Cbody%3E%0A%3Cform%20method%3Dget%3E%3Cinput%20type%3Dhidden%20name%3Da%20value%3Da%3E%3Cinput%20type%3Dsubmit%3E%3C%2Fform%3E%0A%3Cform%20method%3Dget%3E%3Cinput%20type%3Dhidden%20name%3Db%20value%3Db%3E%3Cinput%20type%3Dsubmit%3E%3C%2Fform%3E%0A%3Cscript%3E%0Af%3Ddocument.getElementsByTagName('form')%3B%0Af%5B0%5D.appendChild(f%5B1%5D)%3B%0A%3C%2Fscript%3E
)
--
Philip Taylor
pjt47@cam.ac.uk
Received on Wednesday, 23 April 2008 13:32:18 UTC