9

私のバックグラウンドは、C ++や.NETプログラミングなどの従来のコンパイル済みオブジェクト指向言語であり、現在、新しいプロジェクトのためにJavaScriptを少し使っています。私はAJAXに手を出していて、オブジェクトがブラウザーによってどのように管理されているかという混乱した側面に出くわしました。

[編集#2]-アクティブコンテンツスクリプトの変更

<textarea>使用中XMLHttpRequestのオブジェクトをそれぞれ更新する3つのボタンがある練習ページがあります。

  1. ボタン1は、slowtime.phpからのテキストコンテンツでTextArea1を更新します
  2. ボタン2は、slowtime.phpからのテキストコンテンツでTextArea2を更新します
  3. ボタン3は、fasttime.phpからのテキストコンテンツでTextArea3を更新します

ここで、 slowtime.phpfasttime.phpは、2つのタイムスタンプを持つテキスト/HTMLページを返す単純なスクリプトです。1つはページの読み込み時、もう1つは一定時間経過後です。

一度に1つずつクリックすると、各ボタンが正しく機能します。最初のリクエストが完了する前にボタン2をクリックしてからボタン3をクリックしても、更新は期待どおりに機能します。

最初のリクエストが完了する前にボタン1をクリックしてからボタン2をクリックすると、TextArea1とTextArea2は正しい値を受け取ります。ただし、onreadystatechangeイベントコールは同時に発生します。つまり、最初の応答が遅れ、2番目の応答が到着したときにのみ処理されます。

サンプルコード

Webサイト

<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc(url,target)
{
var xmlhttp;
xmlhttp=new XMLHttpRequest();

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById(target).value=xmlhttp.responseText;
    }
  }
xmlhttp.open("POST",url,true);
xmlhttp.send();
}
</script>
</head>

<body>
<form>

<input type="button" value="Button 1" onClick="loadXMLDoc('slowtime.php','TextArea1')"/>
<input type="button" value="Button 2" onClick="loadXMLDoc('slowtime.php','TextArea2')"/>
<input type="button" value="Button 3" onClick="loadXMLDoc('fasttime.php','TextArea3')"/>

<div><textarea id="TextArea1"></textarea></div>
<div><textarea id="TextArea2"></textarea></div>
<div><textarea id="TextArea3"></textarea></div>

</form>
</body>
</html>

PHPコード(slowtime.php

<?php
     echo date('h:i:s') . "\n";
     sleep(5);
     echo date('h:i:s') . "\n";
?>

質問[改訂]

ブラウザはどのようにXMLHttpRequestオブジェクトを管理しますか?ボタン2と3を押すと、押すたびに新しいオブジェクトがインスタンス化され、それぞれに独立したイベントハンドラがあります。オブジェクトが最初の関数呼び出しを超えて存在する場合(イベントハンドラーが存続するため)、オブジェクトはいつメモリからクリア/破棄されますか?

が別々のオブジェクトである場合XMLHttpRequests、同じURLに2番目のリクエストを送信すると、最初のリクエストの応答タイミングにどのように影響しますか?これはサーバー側の問題でしょうか?

4

2 に答える 2

2

オブジェクトでdeleteが明示的に呼び出されない限り、XMLHttpRequestのコンテキストが削除されることはありません。この場合:xmlhttp。アプリケーションを無駄のないクリーンな状態で実行したい場合は、実際にその変数を何らかの方法で追跡し、クリーンアップする必要があります。Javascriptは元々Webページ用に設計されていたため、自分で阻止しない限り、物事を暴走させる傾向があります。

そうしないと、オブジェクトが他の関数で使用できなくなったり、コールバックが残ったりすると、ブラウザのガベージコレクタによってオブジェクトが削除される可能性があります。

同時に発生するイベントに関する問題については、自分で問題を再現することはできません。そのため、phpの構成に問題があると思われます。サーバーが複数のスクリプトを同時に実行することを許可していない可能性はありますか?

これが私のサーバーでのあなたの例ですが、いくつかのわずかな変更があります: http ://www.seijinohki.net/test.php

于 2012-12-24T19:37:59.853 に答える
1

これはブラウザの問題です。

  • Chrome 23&26はこのように動作します。
  • Opera12はしません
  • IE9はしません
  • Firefox17はしません

たとえば、URLを一意にするslowtime.php?1slowtime.php?2、chromeはこのように動作しなくなります。

ところで-私のテストクロームでは、両方のテキストエリアを同じ値(最初のリクエストからの値)で更新します。どちらも、2番目のリクエストが終了したときではなく、最初のリクエストが終了したときに更新されます。まったく間違っているので、これは確かにバグです。2番目のリクエストが送信されないことをウェブサーバーのログで確認しました。

于 2012-12-24T19:53:48.537 に答える