The label's for attribute doesn't match any element id

11,447 阅读2分钟

先上图: image.png 虽然不影响项目运行,但是飘着红也想看看咋回事。

项目背景

主要技术:

  • vue@2.7
  • @element-ui2.15

运行平台:

  • mac系统;
  • 谷歌113.0.5672.92版本;
  • Node.js:v14.17.3

报错信息:

The label's `for` attribute doesn't match any element `id`. This might prevent the browser from correctly autofilling the form and accessibility tools from working correctly.

To fix this issue, make sure the label's `for` attribute references the correct `id` of a form field.

那什么意思呢?

label标签的“for”属性与任何元素“id”都不匹配。这可能会阻止浏览器正确自动填充表单和辅助功能工具正常工作。

要解决此问题,请确保label标签的“for”属性与一个表单元素的id属性建立对应的引用。

原代码:

  <el-form-item label="姓名" prop="fullName">
      <el-input
        v-model.trim="searchForm.fullName"
        clearable
        placeholder="请输入姓名"
        maxlength="30"
      />
   </el-form-item>

说明el-form-item 标签最终转换成了原生的label标签。 所以el-input 是它想要关联的表单元素,进而构成表单域。 所以想解决这个问题,我们可以手动给input上加一个id属性,属性值和v-model 、prop上的保持一致。

  <el-form-item label="姓名" prop="fullName">
      <el-input
        v-model.trim="searchForm.fullName"
        clearable
        placeholder="请输入姓名"
        maxlength="30"
        id="fullName"
      />
   </el-form-item>

经过测试,是可以解决的。发现控制台报错少了一条。

那继续看看,到底是什么原因导致出现这个问题的呢?

label标签的标准用法

我们来看MDN上的一段代码

<label for="name">Name (4 to 8 characters):</label>

<input type="text" id="name" name="name" required minlength="4" maxlength="8" size="10">

我们发现input标签身上有id属性,与label的for属性值是一样的。那么我们来看下for属性的作用。

表示Label标签要绑定的HTML元素,你点击这个标签的时候,所绑定的元素将获取焦点。

要将 label 绑定到其它的控件,请将 label 元素的 for 属性设置为与该控件的 id 相同。

题外话:input身上还有个属性,它跟捆绑聚焦一点也不搭边。但是,要提交表单,你必须为 label 元素所绑定到的控件指定name。

再探究竟

我们用edge浏览器、safari浏览器都不会报这个问题。所以得出结论应该就是此版本的谷歌浏览器加入的新功能。会自动检测标签的用法是否合规。

感觉应该是框架层面element-ui官方做一个兼容处理,自动给表单元素加上一个与label for属性一致的id。