LoginSignup
27
27

DOM上のIDの重複を検出する

Last updated at Posted at 2015-12-17

HTML5においても、要素のIDの重複は許容されません。

大規模なHTMLファイルや動的なDOMを扱う際、IDが重複しているかどうかを調べるのはValidatorではちょっとやりづらいです。

そこで、ID重複を検出する簡易なチェッカーを作ってみました。

本チェッカーはdocument.getElementByIdなどでは取得できないID重複したDOM要素を、document.querySelectorAll('[id]')のように属性セレクタを用いて複数取得できるという発見を利用しました。
(ただし、IDに対する属性セレクタの仕様を確認していないため、本手法が有効でないブラウザーがあるかもしれません。)

以下がチェッカーです。

pickup-duplicate.js
const idArr = []
const duplicateIdArr = []

document.querySelectorAll("[id]").forEach(elm => {
    const id = elm.getAttribute("id")
    if (idArr.includes(id)) {
      duplicateIdArr.push(id)
    } else {
      idArr.push(id)
    }
})

if (duplicateIdArr.length > 0) {
  console.log("IDの重複があります:", duplicateIdArr)
} else {
  console.log("IDの重複はありません。")
}

これを以下のHTMLファイルを開いた上で開発者ツールのコンソールで実行すれば

no-duplicate.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>has only unique ids</title>
</head>
<body>
  <div id="aaa"></div>
  <div id="bbb"></div>
  <div id="ccc"></div>
  <p id="ddd"></p>
  <div id="eee"></div>
</body>
</html>
IDの重複はありません。

このように重複がないことが確認できます。

一方、以下のようなID重複のあるHTMLで実行すると

duplicate.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>has duplicate ids</title>
</head>
<body>
  <div id="aaa"></div>
  <div id="bbb"></div>
  <div id="ccc"></div>
  <p id="aaa"></p>
  <div id="bbb"></div>
</body>
</html>
IDの重複があります: ["aaa", "bbb"]

と、重複したID名の一覧が表示されます。

27
27
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
27