2012-12-24 20 views
9

Moje środowisko jest w tradycyjnym, skompilowanym języku obiektowym, takim jak programowanie w C++ i .NET, a ja zajmuję się teraz trochę JavaScript dla nowego projektu. Dłubałem w AJAX i natrafiłem na mylące aspekty zarządzania obiektami przez przeglądarkę.Jak obiekty xmlhttprequest są tworzone, scalane i niszczone w JavaScript

[Edit # 2] - Zmiana aktywnych skryptów treści

Mam stronę ćwiczyć z trzema przyciskami, które każda zmiana <textarea> korzystających XMLHttpRequest obiektów:

  1. przycisk 1 aktualizacje TextArea1 z tekstem zawartość od slowtime.php
  2. Przycisk 2 aktualizacje TextArea2 z treścią tekstową od slowtime.php
  3. Przycisk 3 aktualizacje TextArea3 o zawartości tekstowej fasttime.php

Gdzie slowtime.php i fasttime.php są proste skrypty, które zwracają stronę text/html z dwóch znaczników czasu: gdy jeden strona ładuje się, jedna po pewnym czasie minęła.

Każdy z przycisków działa poprawnie po kliknięciu pojedynczo. Jeśli kliknę przycisk 2, a następnie przycisk 3 przed zakończeniem pierwszego żądania, aktualizacje będą nadal działać zgodnie z oczekiwaniami.

Po kliknięciu przycisku 1, a następnie przycisku 2 przed zakończeniem pierwszego żądania, opcje TextArea1 i TextArea2 otrzymują poprawne wartości; jednak wywołania zdarzeń onreadystatechange występują w tym samym czasie, tj. pierwsza odpowiedź jest opóźniona i jest przetwarzana tylko po nadejściu drugiej.

Kod próbki

strony

<!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> 

kodu PHP (slowtime.php)

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

pytania [poprawiona]

W jaki sposób przeglądarka zarządza obiektami XMLHttpRequest? Naciśnięcie przycisków 2 i 3 wskazuje, że każda prasa tworzy nowy obiekt, a każdy z nich ma niezależne procedury obsługi zdarzeń. Jeśli obiekty przeżyją poprzednie wywołanie funkcji (ponieważ ich programy obsługi zdarzeń przetrwają), kiedy zostaną usunięte z pamięci/zniszczone?

Jeśli XMLHttpRequests są oddzielnymi obiektami, w jaki sposób wysyłanie drugiego żądania do tego samego adresu wpływa na czas odpowiedzi pierwszego? Czy to może być problem po stronie serwera?

+0

W swojej funkcji 'xmlhttp.onreadystatechange' powinieneś używać' this.responseText' zamiast 'xmlhttp.responseText'? –

+1

@ JoshuaD.Boyd To nie powinno robić nic więcej, ponieważ zmienna 'xmlhttp' znajduje się w zasięgu lokalnym wewnątrz' loadXMLDoc'. – Tyilo

+0

zmiana wszystkich odniesień do 'xmlhttp' na' this' w funkcji 'onreadystatechange' również działa, a także powoduje to samo zachowanie. – nicholas

Odpowiedz

2

Kontekst do XMLHttpRequest nigdy nie jest usuwany, chyba że na obiekcie zostanie jawnie wywołane usunięcie. W tym przypadku: xmlhttp. Naprawdę powinieneś śledzić ten var i czyścić go, jeśli chcesz, aby aplikacja działała szczupłą i czystą. JavaScript został pierwotnie zaprojektowany dla stron internetowych, a więc sprawia, że ​​rzeczy zaczynają dzika, chyba że sam sobie z tym poradzisz.

W przeciwnym razie możliwe jest, że gdy obiekt nie będzie już mógł być używany przez inne funkcje lub pozostanie oddzwoniony, narzędzie do czyszczenia pamięci przeglądarki usunie obiekt.

Jeśli chodzi o twój problem z wydarzeniami, które zdarzają się jednocześnie, nie mogę odtworzyć problemu osobiście, co pozostawia mnie do uwierzenia, że ​​masz problem z konfiguracją php. Czy to możliwe, że twój serwer nie zezwala na uruchamianie wielu skryptów jednocześnie?

Oto Twój przykład na moim serwerze, z kilkoma niewielkimi zmianami: http://www.seijinohki.net/test.php

+0

Dziękujemy za zamieszczenie kodu na innym serwerze testowym. Kiedy testuję twoją stronę w Chrome lub Safari, otrzymuję te same wyniki co rambo powyżej - oba obszary tekstowe mają tę samą wartość. Tymczasem Firefox, IE9 i Silk tego nie robią. Twoja strona nie działa w ogóle w przeglądarce mobilnej Maxthon. – nicholas

+0

również po długim czasie, źle przyjąć to jako odpowiedź, ponieważ bezpośrednio odnosi się do kontekstu wniosków.Ciekawa dyskusja i pokazuje, przynajmniej w chwili obecnej, że tworzenie stron internetowych/przeglądarek/itp. są w dalszym ciągu podobne do sposobu wykonywania skryptów. – nicholas

1

Jest to kwestia przeglądarki.

  • Chrome 23 & 26 Zachowywać się w ten sposób.
  • Opera 12 robi
  • IE 9 nie robi
  • Firefox 17 robi

Jeśli się unikalne adresy URL, np slowtime.php?1 i slowtime.php?2 to Chrome nie zachowuje się w ten sposób.

btw- w moim testowym chrome aktualizuje oba textareas z tymi samymi wartościami - wartości od pierwszego żądania. i oba są aktualizowane po zakończeniu pierwszego żądania, a nie po zakończeniu drugiego. to na pewno błąd, ponieważ jest po prostu błędny. Weryfikowałem za pomocą dzienników serwera internetowego, że drugie żądanie nie zostanie wysłane.

+0

Kiedy testuję z Chrome lub Safari na serwerze kokorohakai, widzę to samo wyniki, które wykonujesz - oba obszary tekstowe mają tę samą wartość i są ustawione w czasie przy pierwszym żądaniu. Tymczasem na moim serwerze testowym (localhost) otrzymuję dwie różne wartości, z czasem drugą. To prowadzi mnie do przekonania, że ​​odpowiedź jest bardzo skomplikowana i opiera się na zachowaniu przeglądarki i serwera. – nicholas

+0

@nicholas czy twój lokalny dziennik serwera wskazuje dwie prośby? jednak fakt, że chrome wysłał tylko jedno żądanie w moim teście wskazuje na błąd w nim (lub dziwną funkcję). – goat

Powiązane problemy