复杂的HTML表单

时间:2011-10-11 17:05:23

标签: html forms

这个问题并不长,因为我很难解释事情,主持人在缩短这个问题的长度或改进它的标题(同时保持其含义)的任何帮助都将是赞赏。

我正在设计一个可以处理复杂表单的通用应用程序,但要做到这一点,我需要决定如何自己处理表单......所以让我们暂时忘掉服务器后端。 我已经对此进行了一段时间的研究,但似乎找不到任何不过时或不相关的东西。

我解释这个的最简单方法是举个例子,所以让我们假设一个“商人”与“客户数据库”的例子:

一名自雇商人决定为他的每个客户保留一份记录,他可以存储他们的姓名,电话号码,电子邮件,国家,城市和出生日期。 为此,他使用了一个网络应用程序,他可以在他的手机上或在家里的旧办公室电脑上打开。 但遗憾的是,这位商人也是偏执狂,并关掉了他电脑上的所有JavaScript。

商人可能会指派他的秘书添加客户数据,所以让我们打电话给任何正在编辑“用户”表格的人。

这种形式的困难方面是支持多个电话和电子邮件,而国家>没有JavaScript的城市选择。

有几种解决方案,最简单的方法是首先存储客户端,然后在他实际存在之后向他提供他所有的电话号码,电子邮件和国家/地区,但在这种情况下,客户需要拥有他/她所选国家/地区至少存储一个电话号码。

选择国家/地区和城市可以通过一个表单中包含“选择国家/地区”字段和禁用的“选择城市”而没有任何值以及一个显示“选择国家/地区”或类似内容的按钮来完成...它将使用很少使用表单按钮,类似于这样:

<h2>General info</h2>
...name, surname, gender, age selection...
<h2>Country and city</h2>
<p><label>Select country: </label><select name="country">
<option value="United Kingdom">United Kingdom</option> 
<option value="United States">United States</option> 
<option value="France">France</option> 
<option value="Germany">Germany</option> 
<option value="Spain">Spain</option> 
<option value="Italy">Italy</option> 
<option value="Canada">Canada</option></select>
<input type="button" name="select[country]" value="Select Country" /></p>
<p>Select city: <select disabled="disabled"><option value="">No city selected<option></select> (you must first select a country)</p>

用户点击“选择国家/地区”按钮,表单将根据所选国家/地区显示所有输入的数据和“城市”选择字段 (只要表单验证了它输出的数据,并使用表单的唯一标记,它应该是安全的) 它还会显示国家选择字段为禁用,其所选国家/地区为选定值,并显示一个按钮以清除其选择,我们这样做是为了防止用户选择国家/地区,例如“美国”,然后是“城市”纽约“,后来改变了他在国内的选择,并阻止他提交价值country =”Uruguay“和city =”New York“的表格。

另一种方法是只显示一个名为“选择国家/城市”的按钮,当点击该按钮时会导致国家/地区选择表单,而这又会导致城市选择表单,提交时将用户返回到表单他开始。但我认为这个解决方案之上的解决方案更好。

如果有更好的方法,请纠正我。

然后在选择国家和城市之后,表单的用户必须向尚未存储的“客户端”添加至少一个电话号码。 (电子邮件将以相同的方式处理) 这部分,我没有设法做,并希望得到一些帮助。 到目前为止,我所拥有的只是:

...name, surname, gender, age selection...
...country/city selection...
<p><input name="add[phone]" type="button" value="Add phone number" /></p>

点击“添加电话号码”会导致用户可以输入电话号码的不同页面,然后会将其添加到输入字段列表中:

...name, surname, gender, age selection...
...country/city selection...
<p><input name="add[phone]" type="button" value="Add phone number" /></p>
<p>
List of phones that will be added when the client is saved:<br/>
<ul>
<li>987654321<input name="phone[0]" type="hidden" value="987654321" /><button name="remove[phone][0]" value="Remove" /></li>
<li>987654322<input name="phone[1]" type="hidden" value="987654322" /><button name="remove[phone][1]" value="Remove" /></li>
</ul>
</p>

我很确定有更好的方法,我上面做错了,我需要一些帮助。

如果可以通过多种方式理解答案,请提供示例HTML。

P.S。它不一定是“客户数据库”形式,只是它应该支持链式选择并为单个条目添加多个变量“值”(在本例中为电话和电子邮件)。

修改 现在我想到了,手机应该是可编辑的,所以它应该是这样的:

...name, surname, gender, age selection...
...country/city selection...
<p><input name="add[phone]" type="button" value="Add phone number" /></p>
<p>
List of phones that will be added when the client is saved:<br/>
<ul>
<li><input name="phone[0]" type="text" value="987654321" /><button name="remove[phone][0]" value="Remove" /></li>
<li><input name="phone[1]" type="text" value="987654322" /><button name="remove[phone][1]" value="Remove" /></li>
</ul>
</p>

“添加电话”会显示一个包含所有相同字段的表单,但它们将被隐藏并预填充用户值,并添加一个字段以添加新电话。

或者我可以完全跳过它,只显示相同的页面,但添加了一个空的电话号码......或者编辑不同页面上的所有字段? 如果您使用此表单添加和编辑,也会出现问题。

1 个答案:

答案 0 :(得分:1)

您的解决方案出了什么问题?

如果你不能使用javascript,你肯定必须使用多个页面才能处理字段之间的依赖关系。这就是大多数框架所谓的屏幕流程。

如果您知道使用了哪些设备/浏览器,您可以尝试用框架集替换多个页面...国家/地区选择的目标将是一个最初为空的框架集,它将在所有城市获得国家后立即显示从第一个选择......(你觉得我在想什么?: - )

但是框架集很难看并且会导致很多问题。

所以我的建议是使用屏幕流程并确保响应时间非常快......

更新:如果问题是如何处理在表单上工作的多个用户......:

  • 会话对于识别用户并跟踪已填写的表单元素的状态非常有用
  • 更好(更强大)是在<input type='hidden'>字段中保留您需要的信息(来自已填写的元素和其他元数据)。这样,您就不必保持会话 - 表单将始终将所有数据提交给服务器。但请确保在最后一步中再次验证所有字段 - 用户可能已修改了请求。