« linux-igdでIP電話 | メイン | 親知らずの抜歯 »

2006年12月15日

JScriptにはまる

カテゴリー: [プログラミング]

今週,仕事ではまったお話...

JavaScriptというより,JScriptの話です.つまり,IEのせい.

いつも,Webアプリケーションの開発では,まずFirefoxを使って動作確認します.
デバッグ環境が充実していて,圧倒的に開発しやすいですから.
でも,IEで動かないのは困るわけで,ある程度の段階になったら,IEでもテストするわけです.
そこでたいていはまるわけで.今回のもそんな問題です.

prototype.jsのForm.serializeをつかって,formの内容をparameter1=value1&parameter2=value2...のようにシリアライズしてたんですが.
なぜだか,IEにしたとたん,input要素を全部無視して,select要素しか拾わなくなってしまいました.

いろいろ原因を考え,可能性を削っていってもさっぱりわからない.
らちがあかないので,prototype.js を読んで,中で何をしているのか調べました.
結局,問題になるのは単に以下ようなコードでした.

elements = $('フォームの名前').getElementsByTagName('input')

これが,
elements = $('フォームの名前').getElementsByTagName('select')

だと,問題ないのに,inputにしたとたん返ってくるものがおかしくなる.
具体的には,elements.length が [object] になってしまうのです.なぜ,numberじゃないの?

探し始めるノードを変えて,どんどん子の要素に降りていくと,うまくいく場合もある.
formの内側でtableを使っていたので,まさか,それが原因かとも考えますが,調べてもそんな話は出てこない.
生成するHTMLをいろいろ変えてみるとか,試行錯誤するも全く現象は変わらず.

そこで,問題のelementsとelements.lengthのプロパティを全部列挙してみました.
そうしたら,elements.length の中身が,どう見てもDOMの要素にしか見えない...
elementsのプロパティもよーくみて,原因が判明.

inputタグのname属性の名前が,そのままelementsのプロパティになっているじゃないの...
そして,そのプロパティの値はinput要素.
そこで気がついたのが,そういや,lengthって名前のinput要素があったなあ,ということ.

lengthという名前のinput要素に,本来長さを表すはずのlengthプロパティが上書きされてたみたいです.

まあ,何が言いたいかと言えば,もっと早く気づけよ俺,ふざけるなJScript,ということなんですが.
ふとした拍子に名前が衝突し,それも黙って上書きしてしまうという仕様,いいのかよ.
もしかしたら,この話は常識なのかもしれませんけど.

こんな事にずいぶん時間をとられてしまった日でした.

投稿者 shingo : 2006年12月15日 23:59

トラックバック

このエントリーのトラックバックURL:
http://isolinear.info/cgi-bin/mt/mt-tb.cgi/230

コメント

コメントしてください

コメントスパム等の対策のために,大量のURLを含むコメント,古いエントリーに対するコメント,連続したコメントなどは,一旦保留されます.




保存しますか?