[JS]Firefox nie reaguje na powrót danych

0

Napisałem pewien skrypt który bez problemu działa w operze, chrome i kilku innych przeglądarkach. Nie dziala w IE(wiadomo) i pod FF.

 
function checkstate(who,row,cell)	{
	var zwrot="";
	var mouseEvent='onmouseover="javascript:bubelon(this.id);" onmouseout="bubeloff();"';
	var cellid="";
	
	ajax=new XMLHttpRequest();
	ajax.onreadystatechange=function(aEvt) {
		if (ajax.readyState===4 && ajax.status===200) {
			zwrot=ajax.responseText.split("|");
			cellid=row.cells[cell-1].innerHTML;
			row.cells[cell].innerHTML='<img src="style_def/icon/poz-'+zwrot[0]+'.png" id="i-'+cellid+'" alt="icon" width="16" height="16" '+mouseEvent+' /><div class="niema" id="d-'+cellid+'">'+ajax.responseText+'</div>';
			}
	};
	
	ajax.open('GET',"oth/work_prac_stan.php?usr="+who,false);
	ajax.send();
}

function sprawdzstan() {
	var lol="";
	var table = document.getElementById("usery");
	var re = /^<a\shref\=/g;
	
	for (var i = 1, row; row = table.rows[i]; i ++) {
		if (row.cells[0].innerHTML.match(re)) {
			checkstate(row.cells[1].innerHTML,row,2);
		} else {
			checkstate(row.cells[0].innerHTML,row,1);
		}
	}
}

Firefox nie wywołuje wpiętej w "ajax.onreadystatechange". Sprawdzałem firebugiem, dane z pliku php przychodzą poprawne, w ogóle funkcja nie jest uruchamiania. Przeskakiwałem kod krok po kroku i parser nie zajrzał nawet do tej funkcji.

Pod opera i chrome działa bez zadnego problemu. W ie nie działa, ale problem jest inny, źle dziala for z "sprawdzstan()", ale to juz bzdura.

Nie spodziewałem sie, że ten WszystkoMający NajlepiejDziałający WszystkichMiażdżący Firefox będzie problemy robił, żeby jeszcze jakiś błąd wypluwało do konsoli, a tu nic, po prostu nie działa....

0

Gdy nowoczesna przeglądarka, taka jak Firefox, robi problemy -- to jest spora szansa, że to Ty coś spieprzyłeś. Warto wziąć pod uwagę tę możliwość, a nie z góry zakładać, że to "Firefox robi problemy". Może masz tam błąd, który inne przeglądarki litościwie naprawiają. Może Fx faktycznie robi coś głupiego i niezgodnego ze standardami, ale to nie jest pewne.

Zarzuć linkiem do gotowej, (nie)działającej strony, bo sam nie mam sobie tego jak rozstawić i przetestować.

Zachowajmy spokój, gdzieś pewnie jest jakiś mniejszy lub większy błąd. Na milion procent onreadystatechange nie jest uruchamiana? Wstaw tam breakpointa, czy nawet zwykłego alerta. I zakomentuj resztę kodu w funkcji. I wtedy przetestuj.

0

Prawdopodobnie, że powinno być: ajax.send(null); Takie idiosynkrazje ;)

0

ajax.open('GET',"oth/work_prac_stan.php?usr="+who,false);

Kpisz, czy o drogę pytasz? Jawnie mówisz mu, że chcesz to robić synchronicznie (nie asynchronicznie)... czemu sądzisz, że miałby jakikolwiek obowiązek wywoływać ci ten event asynchronicznie? To że robią to Opera i Chrome to chyba tylko dlatego, że autorzy implementacji w owych przeglądarkach nie wpadli nawet na to, że ktoś mógłby to chcieć wywołać synchronicznie...

tak być powinno:
ajax.open('GET',"oth/work_prac_stan.php?usr="+who,true);

0

@Pan kuba:
Faktycznie, być może ze względu na niedoskonałości/niekompatybilności implementacji przeważnie pisze się to null, ale sama specyfikacja pozwala na pominięcie tego parametru (tj. nie trzeba pisać nawet null):
http://www.w3.org/TR/XMLHttpRequest/#xmlhttprequest

@keraj:
I prawdopodobnie znalazłeś na sucho buraka, który stara się popsuć dzień WombaTowi -- mi się nawet nie chciało tego analizować linijka po linijce. Kod wygląda, jakby używał asynchronicznego trybu, a używa synchronicznego. I w nim faktycznie zdarzenie readystatechange nie musi zostać rozgłaszane. Może nawet, jeśli wziąć specyfikację dosłownie, to to zdarzenie NIE MOŻE być wtedy rozgłaszane. Bo wg specyfikacji, przy wywoływaniu każdej z funkcji XHR implementacja MUSI wykonywać określone kroki. Te kroki często zawierają fragment, że "jeśli flaga async jest true, to zmień stan na X". A "zmiana stanu na X" jest definiowana jako wywołanie pewnej operacji (zmiana jakichś flag), a następnie wywołanie zdarzenia readystatechange.

Tak czy siak, Firefox zachowuje się przynajmniej dobrze i jak najbardziej poprawnie. A być może zachowuje się lepiej, tj. ściślej przestrzega specyfikacji, niż inne przeglądarki.

Swoją drogą, może to kolejny przypadek słabości parametrów znacznikowych w API. Może lepiej by było zapewnić dwie funkcje: sendSync i sendAsync. W zasadzie flaga async zawiera w sobie swoistą negację. Jeśli chcemy wysłać żądanie synchronicznie, to ustawiamy ją na... false. A jak asynchronicznie (nie-synchronicznie), to na true :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1