getElementById()でname属性が検索される?

getElementById()でname属性を検索してエレメントを取得できるという話を聞いた。
いや、絶対に推奨されている使い方ではないだろう。
そもそもIDはページ内でユニークだからgetElementById()はエレメントを返して、
複数設定できるname属性用にArrayオブジェクトElementオブジェクト(NodeListオブジェクト)
で返ってくる、getElementsByName()があるのだから。
でも、実際できるって聞いたし。
だから、調べてみた。

ほんとにとれるのか?

サンプルのHTML + JavaScriptを用意する。

<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3c.org/1999/xhtml">
  <head>
    <meta http-equiv="Contet-Type" content="text/html; charaset=TF-8"/>
    <title></title>
    <script type="text/javascript">
        window.onload = function(){
            alert(document.getElementById("txt1").value)
        }
    </script>
  </head>
  <body>    
    <input type="text" name="txt1" value="name"></input>
  </body>
</html>

結果

で、結果

OS ブラウザ スクリプト実行結果
WinXP IE7 nameと表示された
WinXP IE6 nameと表示された
WinXP FireFox2 スクリプトエラー
MacOS10.4 Safari3.1 スクリプトエラー

IEは取得可能のようだ、、、

では、同じ名前のIDとnameがあったら?

先ほどのソースに同じIDを追加して見る

<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3c.org/1999/xhtml">
  <head>
    <meta http-equiv="Contet-Type" content="text/html; charaset=TF-8"/>
    <title></title>
    <script type="text/javascript">
        window.onload = function(){
            alert(document.getElementById("txt1").value)
        }
    </script>
  </head>
  <body>    
    <input type="text" name="txt1" value="name"></input>
    <input type="text" id="txt1" value="id"></input>
  </body>
</html>

同じIDをnameより後にしてるのにするあたりがミソ。

そして結果

OS ブラウザ スクリプト実行結果
WinXP IE7 nameと表示された(え?)
WinXP IE6 nameと表示された(え?)
WinXP FireFox2 idと表示された(正常)
MacOS10.4 Safari3.1 idと表示された(正常)

IEはidとnameの両方をみてるっぽい。
そして、たちの悪いことに最初に見つけたのをとってきてるっぽい。

ほんとに最初をとってるのか?

idとnameをひっくり返して確認してみる。

さらに結果

OS ブラウザ スクリプト実行結果
WinXP IE7 idと表示された(正常) 
WinXP IE6 idと表示された(正常) 
WinXP FireFox2 idと表示された(正常)
MacOS10.4 Safari3.1 idと表示された(正常)

やっぱり最初をとってる、、、

まとめると

IEはgetElementById()はidとname属性両方を対象に検索して最初に見つかったものを
取ってくるようだ。
普通はやらないことだけど、idとnameは絶対に同じ名前はやめとこ。
name属性で検索するときはgetElementsByName()を使う。

取り扱いには十二分に気をつけよ。