IE8で「オブジェクトでサポートされていないプロパティまたはメソッドです」と表示される
2011年10月17日 17時44分
仕事中、既存システムで変な症状が報告された。
1 |
a = b; //←「オブジェクトでサポートされていないプロパティまたはメソッドです」 |
ひねりも何もない代入だけの行でエラーが発生している。
調べてみるとタグのIDと変数名がぶつかっていると発生するエラーということが判明。
なので変数名を変更して解決。
必要ないところでグローバル領域を使用しているのもどうかと思うがIEがID名で変数を作ってしまうのはとても厄介。
はまらないように気を付けよう。
※ネットで突込みを見つけたので追記 2012/06/06
http://b.hatena.ne.jp/entry/www.crossl.net/blogwww.crossl.net/blog/ie8_err_nothing_prop_method/
referer見てたら見馴れないリンク元があったので見てみたら記事に対する突込みがあった。
違うと思う。var で変数宣言しろってのが本筋だと思う。まあID属性値がそのままグローバルオブジェクトのプロパティになるのもどうかと思うけど。
ということで書き殴り全開のこの記事にまさかの突込みをいただいたので掘り下げてみた。
Case.1
- var宣言無し
- タグのIDと同じ変数
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<html> <head>~</head> <body> <span id="a">hoge</span> <script type="text/javascript"> a = 1; // エラー </script> </body> </html> |
Case.2
- var宣言有り
- タグのIDと同じ変数名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<html> <head>~</head> <body> <span id="a">hoge</span> <script type="text/javascript"> var a; a = 1; // エラーなし </script> </body> </html> </script> |
Case.3
- var宣言無し
- タグのIDと違う変数名
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<html> <head>~</head> <body> <span id="a">hoge</span> <script type="text/javascript"> b = 1; // エラーなし </script> </body> </html> |
勿論確認はIE8。
指摘にあった通り、タグIDと同じ名前で変数宣言するとエラーは発生しなかった。
しかしこの記事で言いたかったことはその事ではない。
Case.1とCase.3の変数名による違いである。
Case.1の場合、ウォッチで変数aを見てみるとDispHTMLSpanElementというオブジェクトになっている。
そこへの代入でエラーが発生する。
Case.2の場合、代入前の変数aはundefinedになり代入が可能となる。
var宣言は変数の巻上げが起こるのでどこでされようと最初に変数は定義される。
Case.3のタグIDと変数名が違う場合、JavaScirptは明示的にvarで宣言しなかった場合グローバルオブジェクトのプロパティとして扱われエラーとはならない。
この記事を書いたときには勘違いしていたがCase.1をFirefoxで動かしてみたら代入でエラーが出ないだけで変数aはオブジェクトとして存在していた。
よくよく考えてみればwindow[‘タグID’]見たいなアクセスが出来るのはグローバルオブジェクトのプロパティとして存在しているからだからタグIDの変数が出来るのは当然か。
IEだけ代入時に問答無用でエラーが発生するから誤解してしまった。
しかし指摘通りにvarでタグIDと同じ変数を宣言してしまうと示す変数が変わってしまい以下のような記述が出来なくなってしまうので注意が必要。
1 2 3 4 5 6 7 8 9 10 11 |
<html> <head>~</head> <body> <span id="a">hoge</span> <script type="text/javascript"> // var a; を宣言しているとwindow['a']がタグオブジェクトでなく変数undefinedになりエラーとなる。 alert(window['a'].outerHTML); // <span id="a">hoge</span> </script> |
やはりタグIDとJavaScirptの変数名は分けることが懸命という結論。