跳到內容

jsx_a11y/anchor-is-valid 正確性

功能

HTML <a> 元素,帶有有效的 href 屬性,在形式上被定義為表示一個超連結。也就是說,一個 HTML 文件與另一個 HTML 文件之間的連結,或者一個 HTML 文件內部的一個位置與同一文件內部另一個位置之間的連結。

雖然以前可以在錨點元素上附加邏輯,但隨著 JSX 函式庫的出現,現在可以更容易地將邏輯附加到任何 HTML 元素,包括錨點。

此規則旨在防止使用者在點擊錨點時附加邏輯,並確保提供給錨點元素的 href 是有效的。如果錨點附加了邏輯,規則會建議將其轉換為 button,因為這很可能是使用者想要的。

錨點 <a></a> 元素應使用於導覽,而 <button></button> 應使用於使用者互動。

考慮以下情況

jsx
<>
  <a href="javascript:void(0)" onClick={foo}>
    Perform action
  </a>
  <a href="#" onClick={foo}>
    Perform action
  </a>
  <a onClick={foo}>Perform action</a>
</>

所有這些錨點實作都表示該元素僅用於執行 JavaScript 程式碼。以上所有內容都應替換為

jsx
<button onClick={foo}>Perform action</button>

`

為什麼這不好?

錨點不應具有邏輯且應具有正確的 href 屬性,原因有很多

  • 它會擾亂使用者導覽的正確流程,例如,使用者想要在新分頁中開啟連結,但預設的「點擊」行為被阻止
  • 它可能會導致無效連結,並且網路爬蟲無法瀏覽網站,有損 SEO 排名

範例

有效

jsx
<>
  <a href={`https://www.javascript.com`}>navigate here</a>
  <a href={somewhere}>navigate here</a>
  <a {...spread}>navigate here</a>
</>

無效

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

參考

參考資料

以 MIT 許可發佈。