過去ログ表示


過去ログ 378 を表示

トピック内全 3 記事中の 1 〜 3 番目を表示
[ 最新記事及び返信フォームをトピックトップへ ]
このトピックの全ページ / [0]

(環境: WinXP SP3/Other)

<a href="#" onclick="xxxxx(yyyyy)">
とし、xxxxxの中でwindow.showModalDialog()を実行し、リンク先画面をモーダルで表示している。
開かれた画面においては、モーダルで開いた際に、自画面にPOSTを行い、
再表示をしている。
開かれた子画面において
window.opener.document.main_form.submit();
とし、子画面でボタンが押下親画面のsubmitを呼び出している。

href="#"とすると、親画面のブラウザの左下にリンク先URLが表示されるが、
子画面でボタンを押下した際に、なぜか、親画面のブラウザ左下のリンク先URLに対してGETリクエストが発行される場合がある。

応答が遅くなったときにGETリクエストが発行しているように思える。。
想定していないGETリクエストが飛ぶことはあるのでしょうか?

(環境: WinXP SP3/Other)

> 応答が遅くなったときにGETリクエストが発行しているように思える。
> 想定していないGETリクエストが飛ぶことはあるのでしょうか?

<a href="#">って、何をするものかちゃんと理解していますか?

現在のURLをhttp://a.b.c、リンクを<a href="#アンカー名">、とした時、このリンククリックによるリクエストは、
(A) <base href="http://x.y.z">がある場合は、「http://x.y.z#アンカー名」をロードする、
(B) <base>が無い場合は、「http://a.b.c#アンカー名」をロードする、
になります。
そして、書いている<a href="#">は、(B)における「アンカー名=Null」という一種のHTMLの文法違反、ということになります。
文法違反の時のブラウザーの挙動についてはなんら規定されていないので、
アンカーが見つからない時に、IEだと、同じhttp://a.b.cのトップに移動、Mozillaだと、同じhttp://a.b.cだから現在と同じ場所のまま、というような挙動をします。
この、リンククリックによるリンクURLのロードは、onClickハンドラーでfalseを返さない限り、最終的に実行されます。

書いている<a href="#" onclick="xxxxx(yyyyy)>のリンククリックで行っている事は、
(1) form.Submit()による、http://a.b.c内に定義されたフォームのサブミットのリクエスト
(2) 上記の「http://a.b.c#(アンカー名=Null)」のロードのリクエスト
を、ほぼ同時に出していることになります。
また、<a href="#" onclick="xxxxx(yyyyy)">のxxxxxの中のwindow.showModalDialog()の後にreturn;を実行した時点でonClick=xxxxx(yyyyy)の実行は完了しますから、DialogのWindowにおいて実行されるform.Submit()の方が後になって、リクエストの順番は(2)が先で(1)が後、ということも、起こり得ます。

通常は、先のリクエストの(1)が実行されたあと直ぐにフォームの応答が返ってきてフォームのURLがロードされて、 現在のhttp://a.b.cがアンロードされて現在のhttp://a.b.cの実行環境がなくなるので、(2)の「http://a.b.c#(アンカー名=Null)」のロードが実行されない場合も多いのですが、フォームのサブミットの結果が返ってくるのが遅い場合には、(2)の「http://a.b.c#(アンカー名=Null)」のロードが実行されるケースがでてきます。
あるいは、(2)が先に実行されるが、特にFirefoxだとページ内の場所の移動が発生しないので、同じURLのためにページの遷移は目に見えず、キャッシュからロードされるのでHTTP GETは発生しない、ということもあり得ます。

いずれにせよ、http://a.b.cのロードが発生するのですから、キャッシュの期限切れになっていればHTTP GETが出されて当然、ということになります。

(a) <a href="http://j.k.l"><form action="http://p.q.r")><input type=submit></form></a> や (b) <form action="http://p.q.r")><a href="http://j.k.l"><input type=submit></a></form>、などにおいて、サブミットボタンをクリックした時に、なにがどういった順番でどう実行されるべきか、というような規定は一切ありません。
また、(i) <a href="http://j.k.l">のリンククリックによるhttp://j.k.lのロードのリクエストと (ii) <form action="http://p.q.r")に対するform.Submit()によるhttp://p.q.rのロードのリクエストが、同時に出された場合のブラウザーの挙動についても、一切規定されていません。
HTML本などには<a href="#" onClick="...;form.Submit();...">が例として数多く書かれていますが、<a href="#">は、同じURLのロードであるから、外見上、ページ内でトップに移動するだけ、あるいは、同じ場所が再表示されるだけ、ということを理解した上で、HTML/JavaScriptコードを書くようにしましょう。

(環境: WinXP SP3/Other)

(追記)
HTTP GETが発生し得るか、という質問への答えだけではちょっと不親切そうなので、補足しておきます。

window.showModalDialogは、以下の文書に書いてあるように、開かれたダイアログを閉じるまでフォーカスが親ウィンドウを含めた他のWindowに渡ることがない、というだけであり、親Window自体はちゃんと存在し、そこでのJavaScriptの実行とかイベント処理などもちゃんと実行されます。
> https://developer.mozilla.org/ja/docs/DOM/window.showModalDialog
> http://msdn.microsoft.com/en-us/library/ms536759.aspx
> Remarks
> A modal dialog box retains the input focus while open.
> The user cannot switch windows until the dialog box is closed.

MS Winだと、最前面にでているWindowのプライオリティが最大になり、それ以外のWindowでの処理は遅らされる、というようなことがあって、大体は意図通りの順に実行されて親ウィンドウでの<a href="#">の実行までは行かないのでしょうけれど、少なくともWindow単位でのマルチタスキングくらいは行われていて、最近はマルチCPU/マルチコアが当然のようになっていますから、同時並行的ににたくさんのリクエストを出していて、それらが意図通りの順番に実行されることが必要ならば、たとえ通常はいい加減に書かれるであろうブラウザー内のHTML/JavaScriptのWebプログラミングであっても、それなりのコーディングが必要になってきます。

<a href="#" onclick="xxxxx(yyyyy)>で、onClickハンドラーの中で別Windowを開き、その別WindowにロードされたHTML/JavaScriptによって、親Windowにおけるフォームのサブミットを意図的に行っているのだから、明示的に親Window側で余計なロードを発生させないようにすることが、必要になってきます。
以下が、一般的でシンプルな方法の例です。
(A) <a href="#" onclick="xxxxx(yyyyy);return false;>
リンクのデフォールトアクションのhrefのURLのロードは、onClickハンドラーからのfalseの戻り値によって、抑止されます。
(B) onClickハンドラーを使いたいだけであるにも関わらずリンクを使う、ということを止める。
(例)<button onClick="xxxxx(yyyyy);">ダイアログを開いた後フォームサブミット</button>

携帯用の場合は、<a href>でないとクリックさせてくれない、とかがあって、<a href="#" onClick=...>というような書き方が必須になることもあるみたいですが。


このトピックの全ページ / [0]

返信不可


- Child Tree -