Skip to content
← Back to rules

jsx-a11y/anchor-is-valid 正确性

它的作用

HTML <a> 元素,若具有有效的 href 属性,则正式定义为表示一个 超链接。 也就是说,它连接的是两个 HTML 文档之间,或同一文档内两个位置之间的链接。

虽然过去可以将逻辑附加到锚元素上,但随着 JSX 库的出现, 现在更容易将逻辑附加到任意 HTML 元素上,包括锚元素。

此规则旨在防止用户通过点击锚元素来执行逻辑,同时确保提供给锚元素的 href 是有效的。如果锚元素附带了逻辑,该规则建议将其改为 button,因为这很可能是用户真正想要的效果。

<a></a> 元素应用于导航,而 <button></button> 应用于用户交互。

考虑以下情况:

jsx
<>
  <a href="javascript:void(0)" onClick={foo}>
    执行操作
  </a>
  <a href="#" onClick={foo}>
    执行操作
  </a>
  <a onClick={foo}>执行操作</a>
</>

上述所有锚元素的实现都表明该元素仅用于执行 JavaScript 代码。所有这些都应该替换为:

jsx
<button onClick={foo}>执行操作</button>

为什么这是不好的?

锚元素不应包含逻辑且必须拥有正确的 href 属性,原因有很多:

  • 可能会破坏用户导航的正常流程,例如用户希望在新标签页中打开链接,但默认“点击”行为被阻止
  • 可能导致无效链接,搜索引擎爬虫无法正确遍历网站,从而影响 SEO 排名

示例

此规则的 有效 代码示例:

jsx
<>
  <a href={`https://www.javascript.com`}>跳转至此</a>
  <a href={somewhere}>跳转至此</a>
  <a {...spread}>跳转至此</a>
</>

此规则的 无效 代码示例:

jsx
<>
  <a href={null}>跳转至此</a>
  <a href={undefined}>跳转至此</a>
  <a href>跳转至此</a>
  <a href="javascript:void(0)">跳转至此</a>
  <a href="https://example.com" onClick={something}>
    跳转至此
  </a>
</>

参考资料

配置

此规则接受一个配置对象,包含以下属性:

validHrefs

type: string[]

default: []

有效 href 值的字符串列表。

如何使用

要通过配置文件或 CLI 启用 此规则,可以使用:

json
{
  "plugins": ["jsx-a11y"],
  "rules": {
    "jsx-a11y/anchor-is-valid": "error"
  }
}
bash
oxlint --deny jsx-a11y/anchor-is-valid --jsx-a11y-plugin

参考资料