【问题标题】:Any hidden reasons to use ids instead of name attributes to identify fields in forms?使用 ids 而不是 name 属性来识别表单中的字段有什么隐藏的原因吗?
【发布时间】:2011-10-03 22:24:22
【问题描述】:

我正在开发一个大型 Web 应用程序项目,之前的设计师喜欢使用 id 作为句柄来形成字段而不是名称属性。

我想这样做的一个优点是通过 Javascript 查找该字段通过 ids 更快。

然而,我现在遇到的一个大问题是 id 具有全局范围。我想将大量数据库列名重构为更标准的命名方案,该方案不包含任何列名前缀来标识该列属于哪个表。这将在那些使用 id 的表单中引起问题,因为字段 id 直接对应于列名。像“zon_name”和“pro_name”这样的列名现在都将只是“name”。这将导致 html 中的非唯一 ID。

那么,在冗长的序言之后,这是我的问题......

在我尝试通过更改所有表单以使用名称属性而不是 id 来解决此范围界定问题之前,除了查找的速度之外,我没有考虑到原始开发人员可能有使用 id 的任何其他原因?

我知道这篇文章很长,所以我感谢任何有勇气通读并给出好的答案的人。谢谢!

【问题讨论】:

    标签: html forms namespaces name-attribute


    【解决方案1】:

    姓名和身份证做不同的事情,虽然有一些重叠,但它们在最重要的事情上是不可互换的。

    使用名称

    • 确定当表单提交到服务器时将赋予数据什么键
    • 创建广播组
    • 从 JS/CSS 当你需要一次引用多个表单控件时(并且在添加类或使用元素类型时不更合适)

    使用 id

    • 在控件的<label>for 属性中
    • 当您需要引用特定输入时来自 JS/CSS

    我想这样做的一个优点是通过 Javascript 查找该字段通过 ids 更快。

    不显着(特别是当名称是唯一的时)。

    听起来最初的设计者并没有遵循标准约定,而是提出了一些高度依赖 JavaScript 的东西。

    【讨论】:

    • 在我看来也是这样。您和下面提到的唯一其他用途是标签的 for 属性必须对应于 id。但这似乎设置的唯一真正功能是,当您单击标签时,它会将您带到“for”中通过 id 引用的相应字段。如果这意味着您必须为页面上的每个表单字段(可能有数千个)使用唯一的 id 乱扔 DOM,这似乎并不是一件特别有用的事情。
    • 如果您尝试单击单选按钮或复选框,这是一个主要的好处。 Big click targets are better。但它将标签与控件相关联,以便(例如)屏幕阅读器。如果您有数千个输入,那么(除了页面可能很笨拙)您可能会以编程方式生成它们,并且为自动生成的前缀添加计数器并不难。
    • 好的,很高兴知道还有其他用途。我认为主要问题是这种做法是在没有太多远见的情况下采用的。已经有许多相同形式的重复项使用相同的 id 开头。所以最初的设计者要么没有意识到这一点,要么没有意识到 id 属性的预期用途是什么。此外,表单序列化程序在向服务器构建发布请求时会查找 id。因此,这种做法已成为应用程序运作方式不可或缺的一部分。这会很难,但我想我必须开始清理它。
    • @Quentin 使用id 的两个原因都可以避免。将表单元素包裹在label 中并避免for。并且只使用id 来快速查找form,然后使用name 来访问表单字段。
    • @Mic — for 具有更好的浏览器支持,并允许更灵活的布局,然后将控件放入表单中。
    【解决方案2】:

    如果您使用表单,则应使用<label for="aFormElement"> 以及表单元素。

    label 上的 for 属性与 id 属性匹配,而不是 name 属性。

    所以,你真的需要 both id(用于label 等) name 用于服务器端代码。

    【讨论】:

    • 我认为他的意思是 nameid 从 JavaScript 访问表单元素的好处..?
    • 实际上,我记得这是他似乎这样做的另一个原因。该应用程序还使用了许多标签元素以及指向 ID 的链接。谢谢你提醒我!
    • 如果您将表单元素包裹在标签内,您可以避免使用 ID:<label><input type="checkbox"/> <span>caption</span></label>
    【解决方案3】:

    为了快速找到您的元素,您可以在表单上设置id
    然后对于字段使用name 来读取它们:

    var form = document.getElementById('theForm'),
        productName = form.productName.value;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2012-07-01
      • 2011-01-11
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多