- 締切済み
配列の大括弧と丸括弧はどう違う?
var list = document.getElementsByTagName('div'); alert(list.item(0).id); ←div要素のid属性の値が表示される alert(list.item[0].id); ←FireFoxでは、has no property エラーが出る 配列のIndex指定としては、後者が妥当な気がするのですが、 なぜこの場合は丸括弧で期待される結果が出るのでしょうか? itemという関数を引数0で指定した結果のプロパティ"id"のように 見えるのですが...。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
item()はどうやらArray()ではなくDOMに関するメソッドの様ですね。 MacIE、iCabでもサポートしている様でした。 動作の違いは、item()の引数に文字列を指定すると、 IEとOperaではそのノードのID、またはNAMEと引数が一致するモノを取得出来ますが、 Netscape8.1とFirefoxでは取得出来ず。parseIntできないため引数を0として扱っている? SafariとiCabは動作停止。 <input type="text" name="input1" id="input1" value="hello"> <input type="text" name="input2" id="input2" value="world"> <script> var ilist=document.getElementsByTagName('input'); var itm=ilist.item('input2'); alert(itm.value); // Fxでは"hello" // IE、Operaでは"world" </script> style.filtersはIEしか使えないので、style.filters.item('フィルター名') は問題なさそうです。 IDを指定できればgetElementsByTagNameとitem()の併用で使い勝手がよくなると思ったんですが、 FxとSafariで動かないとちょっと、、、
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
HTMLTableElementのcells[0]とcells.item(0)とか、 style.filters[0]とstyle.filters.item(0)くらいしか知りません。 getElementsByTagNameの戻り値でも使えるのは知りませんでした。 とすると、item()はArrayオブジェクトのメソッドでしょうか? 私の知る限りでは、 list[0] list.item(0) のどちらかで、list.item[0]という使い方はできません。 style.filtersのみitem()を使って、それ以外(テーブルも)は普通の配列として[]を使っていますが、 配列として扱うのは、list.lengthの関係で都合がいいというか、見やすいんですよね。 filters.itemには数値ではなく'DXImageTransform.Microsoft.Alpha'など、文字列で指定出来るのがいいのです。 どっちが推奨されてるとか、どちらかをサポートしていないブラウザがある・ないとか、 あるんでしょうか?(便乗質問すみません)
本当にそのような動きをするブラウザがあるなら、document.getElementsByTagName('div')で作られた配列にitemと言うメソッドがあるか無いかの違いだけじゃないでしょうか。 こんなイメージのことをブラウザが勝手にやってくれているがどうかの違いじゃないでしょうか。 window.onload=function(){ var list = document.getElementsByTagName('div'); list.item = function(n){ return this[n]; } alert(list.item(0).id) list.item = list//これって凄く無駄なプロパティですね。 alert(list.item[0].id) } </script> 一応DOMでもitemはメソッドのようです。 http://72.14.235.104/search?q=cache:4DIsFp0867UJ:www.mozilla-japan.org/docs/dom/technote/tn-dom-table/+dom+item+%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89&hl=ja&ct=clnk&cd=1&gl=jp javascriptでitemと言うプロパティがあるかどうかは知りません。
- MAN_MA_RUI
- ベストアンサー率41% (426/1024)
実際にNetscape 7(Gecko 1.4)と8(Gecko 1.7)とSeaMonkey1.1(Gecko 1.8.1)とOperaで実験してみましたが結果は全て同じ。エラーになりました。 (SeaMonkey1.1はシステムのバージョンがFirefox2.0と同じなのでスクリプトの解釈もほとんど同じです。) エラー: list.item[0] has no properties と言うことは()が正しいということですね。今回の場合。 理由などの詳しいことは…どうなんだろう(調べてるけどよく分からない)
- neue_reich
- ベストアンサー率21% (138/647)
JavaScriptの解釈はブラウザ次第ですので、FireFoxの仕様です、としか言いようがないと思います。 IEやネスケでは"[0]"で問題ないと思いますが…
補足
ご回答ありがとうございます。 ()や[]といった構文の根本を成す部分が、実装によってブレたりするものなのでしょうか...?? そうだ、と言われれば納得するしかないですが、 ちょっと腑に落ちないので、質問させていただきました。 他の解釈があれば、ぜひご教授お願いいたします。
お礼
会社の先輩に確認したところ、 itemは正しくメソッドであり、item(0)は紛れも無く関数呼び出しだそうです。で、その戻り値がNodeListだから、そのオブジェクトを受け取った上で、.演算子がそのプロパティを連結してalertで表示できる。 との事でした。 ブラウザどうこう、という話では、やはりないそうです。 自己解決すみません。 更なる有識者のアドバイスを求めて、もう少し質問はOPENしておきます。