1

問題をデバッグしているところ、FirefoxとSafariがonclickJavaScriptを処理する方法に奇妙な動作が見つかりました。

これが私のコードです:

<form id="createMessageForm" action="onclick.php?refresh=<?php echo ++$_REQUEST['refresh'];?>" method="post" >
<input type="hidden" id="iteration" value="1"/>
</form>
<a href="page2.html" target="_blank" onclick="document.getElementById('createMessageForm').submit();return true;">Hello</a>

これをFirefoxにロードすると、常に「page2」が開きます。しかし、これをSafariにロードすると、「page2」が開くのは10回に1回以下です。これは、ブラウザが「trueを返す」を終了できるかどうかに依存するようなものです。フォームが送信される前のステートメント。

JavaScriptは常にシングルスレッドだと思っていたので、そのようなコードで予想される動作は何ですか?

4

3 に答える 3

1

あなたが言うように、Javascriptはシングルスレッドです。ただし、非同期で作業することもできます。

HTTP リクエストは、完了するまでに不明な時間がかかる可能性があるため、javascript の非同期イベントです。Javascript は HTTP 要求を呼び出し、HTTP 要求が完了して制御が Javascript に戻るまで (または、この場合、完了してブラウザーが新しいページをロードするようにトリガーするまで)、他の処理を続行します。

あなたの場合、基本的には、Javascript から 2 つの HTTP リクエストを次々に発行しています。2 番目は、Javascript が最初の応答を待たないため発生します。それは次のものに続くだけです。表示されている予測不可能な結果は、基本的に、2 つの HTTP 要求のどちらかが先に応答を完了し、ブラウザーに新しいページをロードさせた結果です。

これは AJAX の仕組みでもあります。AJAX の「A」は非同期を表します。Javascript は HTTP リクエストを作成し、喜んでその他の処理を実行します。HTTP 要求はブラウザーによって処理され、要求の準備ができたときに JavaScript が取得するイベントがトリガーされます。if(success)そのため、AJAX 呼び出しでは、コードの次の行で単に言うのではなく、'success' 関数を指定する必要があります。

そして、それはあなたの問題を解決するための提案に私を導きます. フォーム送信を AJAX イベントとして起動します。そうすれば、ブラウザが応答したときに新しいページとしてロードしようとすることはありません。必要に応じて、その後すぐに別のページの読み込みをトリガーするようにブラウザーに指示することもできますが、最初の呼び出しが完了するまで待つことをお勧めします。そうしないと、実際に成功したかどうかがわからないからです。

それがあなたの助けになることを願っています。

于 2012-11-29T22:06:05.443 に答える
0

フォームが送信され、 onclick.php 内のサーバー側で処理されたら、phpを page2 にリダイレクトします。少なくとも、あなたが書いたコードはそれを行う理由を示していません。

私はそれを引用します:

<form id="createMessageForm" action="onclick.php?refresh=<?php echo ++$_REQUEST['refresh'];?>" method="post" >
<input type="hidden" id="iteration" value="1"/>
</form>
<a href="page2.html" target="_blank" onclick="document.getElementById('createMessageForm').submit();return true;">Hello</a> 
于 2012-11-29T21:53:29.487 に答える
0

ここであなたの質問は何ですか?それは基本的に Pointy が言ったことです。ブラウザの実装に依存します。

あなたの質問がそれを修正する方法である場合は、単に変更してください

return true; into -> return false;

あなたのリンクで

于 2012-11-29T22:05:09.430 に答える