« linux-igdでIP電話 | メイン | 親知らずの抜歯 »
2006年12月15日
JScriptにはまる
カテゴリー: [プログラミング]今週,仕事ではまったお話...
JavaScriptというより,JScriptの話です.つまり,IEのせい.
いつも,Webアプリケーションの開発では,まずFirefoxを使って動作確認します.
デバッグ環境が充実していて,圧倒的に開発しやすいですから.
でも,IEで動かないのは困るわけで,ある程度の段階になったら,IEでもテストするわけです.
そこでたいていはまるわけで.今回のもそんな問題です.
prototype.jsのForm.serializeをつかって,formの内容をparameter1=value1¶meter2=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