- 締切済み
Win IEかprototype.jsのバグでは?
prototype-1.6.1.jsのAjax.Updaterを使用して、FORM情報をPOSTする際に、 ある条件で、JavaScriptで、submitオブジェクトのclick関数を呼び出した場合、 InternetExplorer系(6、7、8)において、 idで指定した部分の内容がPOST送信後に呼び出されるページに 切り替わらないという現象が発生しています。 尚、他のブラウザではidで指定した内容が、 POST送信後に呼び出されるページに切り替わっています。 ○確認したブラウザ Firefox3系 Opera 11.00 Safari 5.0 Win InternetExplorer 6,7,8 JavaScript側 - Ajax.Updater呼び出し function blogCommentRegist(id,form){ new Ajax.Updater(id, url, { postBody : Form.serialize(form), method: 'post'}); } HTML側 <form action="/comment-regist" onsubmit="javascript:pageCTRL.blogCommentRegist('doc_div_respond',this);return false;"> …(text、textarea)… <input type="submit" name="submit-type" value="戻る" class="submit" id="comment-submit"/> <input type="button" name="submit-button" value="submit" class="submit" onclick="javascript:$('comment-submit').value='submit';$('comment-submit').click();"/> </form> 他のページではbuttonオブジェクトからsubmitオブジェクトのclick関数呼び出しをしていないもので、 正常にPOST送信後に呼び出されるページに切り替わっています。 このclick関数呼び出しだと正常に切り替わらない不具合というのがあるか、 また解決方法を分かる方、 是非ともご教示頂きたいと思います。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- mibusys
- ベストアンサー率60% (18/30)
prototypeがどうのこうのという問題ではないと思いますよ。 なんでもそうなんですが、原因特定をしたければ 少しずつ切り離していいくというアプローチが必要です。 SE/プログラマーの作業内容に限らずあらゆる面で同じです。 prototypeがおかしいかも知れないと思っているのであれば prototypeを使わないコードにすればそれが悪いのか どうかが分かります。 でも、prototypeがどうとかIEがどうとかに関係なさそうな 基本的な部分で問題が発生しているようなのでそこについて書きます。 まず、「$('comment-submit').click();」 がなかったらどうなるの?ってとこですかね。 おそらくは、formの送信先に切り替わるのではないかと思います。 この推測が正しいと仮定して話を進めます。 このコードではsubmitは実質的にページ切替の意味を持っています。 つまりページの切替処理を行った後に、その処理が完了する前に 元の画面を操作し、さらに画面遷移を行なうことを 期待しているわけです。 しかしそれはやや無理があるように思えます。 簡単に言えば、ページ遷移の命令を2回連続で発行し 2回目のみを有効にしろといっているようなものですよね。 どんなブラウザでも必ず2回目のページ遷移のみを有効に すべきとRFCで定めているのだと思いますか? ネットワークの通信速度やサーバーの反応速度もしくは クライアントのPCのスペックによって、 あるいはブラウザのバージョンや同一バージョンでも設定によって 変わるかもしれません。 どう動くか分からない「submitの後にclick」というコードが そもそもバグだと思います。 で、どうすべきか。 (1)サイズ0*0の見えないiframeをつくって、formの送信先をtargetでiframeに指定する。こうすれば、submitのページ遷移を無効に出来ます。これが一番簡単かもしれません。しかしclick関数に頼るのはどうかと思います。 (2)submit送信後に返す画面を表示したい画面にする。これが本来あるべき姿です (3)submit送信後に返す画面を表示したい画面にリダイレクトする。これでもあるべき姿に近いと思います 何らかの理由で(2)に出来ていないのだと思うので、 (1)か(3)がいいと思います。