none
formオブジェクトの参照方法についての資料をご存知ありませんか? RRS feed

  • 質問

  • formオブジェクトの参照方法について、
    「こういう使い方ができます」といった資料(URL)をご存知ありませんか?

    たとえば下記のXHTMLにおいて
    <form id="Form1">
     <input type="text" id="Text1" />
    </form>

    var obj = document.Form1.Text1.value;

    はname属性を期待しているためスクリプトエラーになりますが

    var obj = Form1.Text1.value;

    はIE6,IE8で正常に動作しています。
    この「Form1」は一見name属性を期待しているように見えるのですが
    ちゃんと[id」で動いています。

    この方法を私は知りませんでした。

    現在XHTMLによってname属性が非推奨となることによる、
    既存アプリケーションの影響調査をしていて、できれば

    「この方法は正しい書き方なので修正しなくて良い」

    という判断を下したいのですが、その根拠が探し出せません。

    この方法が正規の記述だと書いているサイトなどがありましたら
    教えていただきたく思います。

    よろしくお願いいたします。

    2009年10月2日 2:24

回答

  • 以前、IE8でその機能がなくなったような記述を見た気がしたんですが、見つけられませんでした。
    ただ似たようなものを一つ見つけたので引用しておきます。Introduction to Dynamic HTML から
    When Windows Internet Explorer encounters a tag that defines an id or name, it creates a reference to it in the global scope so that it can be easily located by script; however, this is considered non-standard behavior. To ensure the widest browser support for your DHTML, use getElementById to locate target elements.
    とのこと。<form>下のidに限りません。IE4で既にこの機能があったそうです。
    2009年10月2日 15:40
  • document.getElementById() でしょうね。こちらはid属性を使用するので、name属性の廃止に影響しません。
    何を持って「正規」とするか微妙なところですが、この方法はリンク先にも書かれていますが、DOM Level1に準拠します。
    注意点としては、<form>を意識した場合、id属性とname属性の両方を記述しなければならない点と、<input type="radio">などname属性は同じものを指定しますが、id属性はそれぞれ別の名前を指定する必要があります。
    2009年10月2日 3:23
  • 答えはすでに佐祐理さんが書かれていますが、ほかにも同様な記述がありましたので、ご参考まで
    に書いておきます。

    IE の仕様の記述ではないですが、マイクロソフト公式解説書「ASP.NET AJAX 入門」に以下の記述
    がありました。

    "Internet Explorer は、ほかのブラウザでは機能しないさまざまな非標準の簡易表現を DOM にお
    いてサポートしています。もっともありがちな問題は、document.getElementById を使用せずに、
    直接名前を指定して、HTML 要素を参照することです。"

    というわけで、

    > 「この方法は正しい書き方なので修正しなくて良い」

    と言い切るのは難しそうに思います。

    2009年10月3日 2:50

すべての返信

  • document.getElementById() でしょうね。こちらはid属性を使用するので、name属性の廃止に影響しません。
    何を持って「正規」とするか微妙なところですが、この方法はリンク先にも書かれていますが、DOM Level1に準拠します。
    注意点としては、<form>を意識した場合、id属性とname属性の両方を記述しなければならない点と、<input type="radio">などname属性は同じものを指定しますが、id属性はそれぞれ別の名前を指定する必要があります。
    2009年10月2日 3:23
  • 回答ありがとうございます。

    正直、私も新規にコードを起こすのであれば、
    間違いなくgetElementById()か、そのショートカットを作ります。

    ところが今回は既存アプリケーションの調査で、このような書き方を発見し、
    さらにname属性がなくても問題なく動作するため。

    「こんな書き方できるって、どこに書いてあったんだろう?」

    という疑問なのです。

    質問後もずっと調べており、いまは
    ・IEのみの機能らしい。
    ・windowオブジェクトのプロパティとしてForm1が存在しているように見える。

    という想定で調査しています。
    現在は、IEの仕様で

    「IEはwindowオブジェクトにformタグのidでプロパティを作っている」

    という記述がどこかに無いかさがしています。

    2009年10月2日 5:19
  • 以前、IE8でその機能がなくなったような記述を見た気がしたんですが、見つけられませんでした。
    ただ似たようなものを一つ見つけたので引用しておきます。Introduction to Dynamic HTML から
    When Windows Internet Explorer encounters a tag that defines an id or name, it creates a reference to it in the global scope so that it can be easily located by script; however, this is considered non-standard behavior. To ensure the widest browser support for your DHTML, use getElementById to locate target elements.
    とのこと。<form>下のidに限りません。IE4で既にこの機能があったそうです。
    2009年10月2日 15:40
  • 答えはすでに佐祐理さんが書かれていますが、ほかにも同様な記述がありましたので、ご参考まで
    に書いておきます。

    IE の仕様の記述ではないですが、マイクロソフト公式解説書「ASP.NET AJAX 入門」に以下の記述
    がありました。

    "Internet Explorer は、ほかのブラウザでは機能しないさまざまな非標準の簡易表現を DOM にお
    いてサポートしています。もっともありがちな問題は、document.getElementById を使用せずに、
    直接名前を指定して、HTML 要素を参照することです。"

    というわけで、

    > 「この方法は正しい書き方なので修正しなくて良い」

    と言い切るのは難しそうに思います。

    2009年10月3日 2:50
  • 佐祐理さん、SurferOnWwwさん回答ありがとうございます。
    遅くなってすみません。

    正直私も、情報があまりに少ないため「修正しない」で押し切るのは難しいかなと思い始めています。

    今回は、

    佐祐理さんに教えていただいた「Introduction to Dynamic HTML」も参考にしつつ
    「直接そのような記載が載っている資料は見当たらないが、現状は問題なく動作する」
    で押し通せるか、

    「問題なく動作するけど、一般的に使われている方法ではないのでgetElementByIdに直す」
    としてしまうか

    といった選択肢になるかな、と思っております。

    2009年10月5日 0:47
  • こんにちは、フォーラムオペレーターの三沢健二です。

    佐祐理 さん、SurferOnWww さん、ご丁寧な回答ありがとうございます (^^)

    今回、みなさまから案内いただいた情報が参考になられたとの事でしたので、ひとまず私の方で [回答としてマーク] を付けさせていただきました。


    それでは、また何か疑問や質問がありましたら、TechNet フォーラムに投稿してください。
    今後ともよろしくお願いします (^^)/

    ______________________________________
    マイクロソフト株式会社 フォーラムオペレーター 三沢健二

    2009年10月19日 5:35
    モデレータ