【问题标题】:<select> whose values depend on another <select><select> 其值取决于另一个 <select>
【发布时间】:2009-08-19 11:01:16
【问题描述】:

我可以想到一种方法来做到这一点,但我不知道它是否是唯一的方法。

在我网站上的一个页面上,我有两个选择框,一个“父”选择框和一个“子”选择框。 “子”选择框中的值取决于“父”选择框中选择的内容。这在 JavaScript 中通过 AJAX 调用很容易解决,但是我尝试以这样一种方式构建我的网站,以便在关闭 JavaScript 时它们会优雅地降级。

对于非 js 用户,我能想到的解决这种情况的唯一方法是有一个表单按钮,它将重新加载 PHP 页面并将变量附加到 URL,然后 PHP 将检测到这一点并发送值到“孩子”选择。然而,这是一个可用性问题和 IMO,这是一种丑陋的处理方式。

我还有其他方法可以做到这一点吗?这些值不一定需要在选择框中。

【问题讨论】:

    标签: php html forms usability


    【解决方案1】:

    使用OPTGROUPs 有助于 JavaScript 过滤和禁用 JavaScript 时的可用性(假设没有大量选项)。

    第二个SELECT

    <select>
      <optgroup name="colors" label="Colors">
        <option value="red">Red</option>
        <option value="blue">Blue</option>
      </optgroup>
      <optgroup name="sizes" label="Sizes">
        <option value="small">Small</option>
        <option value="medium">Medium</option>
        <option value="large">Large</option>
      </optgroup>
    </select>
    

    请记住,即使启用了 JavaScript,服务器端代码也需要验证选项。

    【讨论】:

      【解决方案2】:

      除非确实有数千种可能的选项,否则您不需要 AJAX。您可以简单地将所有可能的值加载到第二个选择中(带有选项组以提高可读性),并在选择父项后使用 JS 过滤它们。您还需要使用 JS 禁用第二个框,以便用户始终先选择父级。

      【讨论】:

        【解决方案3】:

        不幸的是,如果您想将表单全部保留在一个页面上,那么没有脚本就没有真正的好方法 - 您对按钮的想法可能是您能得到的最好的。

        另一种选择是将表单变成一个多步骤流程,在其中他们选择一个页面上的父项,然后在流程中移动到具有子项选择的下一页 - 本质上是一个向导式的方法。

        【讨论】:

          【解决方案4】:

          禁用 Javascript 后,您别无选择,只能等待用户提交回服务器。

          如果您的父选择中的值足够小,您也许可以为每个值选择一个选择,这样就无需更新内容。

          老实说,我不会打扰:统计数据显示 1% 或更少的用户禁用了 Javascript。越来越多的人使用 Safari 和 Opera,很多人甚至懒得在这些浏览器上测试他们的网站。

          要么这样,要么您必须选择一组不同的 UI 元素,它们会更优雅地降级。

          最后,值得指出的是,如果网站做得足够好,您可以在 300 毫秒内完成页面刷新,此时(就用户体验而言)返回服务器。

          【讨论】:

          • 您在哪里找到了该统计数据?我认为它更接近百分之五。也许我只是想在这里成为一个完美主义者。
          • stackoverflow.com/questions/121108/… 但问题是很难真正量化。移动浏览器会影响这个数字,这实际上取决于您网站的受众。
          猜你喜欢
          • 2011-03-20
          • 1970-01-01
          • 1970-01-01
          • 2021-01-05
          • 2015-07-16
          • 2013-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多