Gå til innhold

[Løst]Et lite javascript (AJAX) problem


Anbefalte innlegg

Hensikten med koden er at en e-post adresse skal sjekkes opp mot en database om den finnes eller ikke. Variabelen "epost" er da adressen. "httpObj" variabelen er XMLHttpRequest objektet. Funksjonen "sjekkEpostDB" skriver enten ut OK hvis epost ikke finnes og ERROR hvis den finnes. Problemet er at uansett hva jeg skriver inn så kommer ERROR opp. Problemet er ikke på serverside scriptet som sjekker e-posten, fordi det returnerer riktig verdi. Det kommer også opp rett alert-melding ut i fra om epost finnes eller ikke (da går jeg ut i fra at rett return true eller false også blir kjørt). Så jeg lurer på om det kanskje kan være noe rart med:

 

return httpObj.onreadystatechange=function()

{

}

 

Er dette lovlig? Noe annet som ser feil ut?

 

En annen ting. Kan man returnere bool verdier og int verdier med responseText?

 

 

if(sjekkEpostDB(epost))
{
document.getElementById('epost_msg').innerHTML = '<div class="okMsg">OK</div>';
}
else
{
document.getElementById('epost_msg).innerHTML = '<div class="errorMsg">ERROR</div>';
}


function sjekkEpostDB(epost)
{
var response = null;
httpObj.open('get', '/sjekk_epost_db.php?epost='+epost, true);
httpObj.send(null);
return httpObj.onreadystatechange=function()
{
	if(httpObj.readyState == 4)
	{			
		response = httpObj.responseText;
		//responseText er "true"(string) hvis epost finnes i databasen og "false"(string) hvis ikke.
		if(response.match("true") == null)
		{
			alert('Hurra! E-post finnes ikke!');
			return true;
		}
		else
		{
			alert("E-post finnes!")
			return false;
		}
	}
}	
}

Lenke til kommentar
Videoannonse
Annonse

Hmm, du skriver at «uansett hva jeg skriver inn så kommer ERROR opp». Jeg ville trodd det ble omvendt, at OK uansett kommer opp.

 

Du har rett i at feilen er return httpObj.onreadystatechange=function(){...};. Her returnerer du et funksjonsobjekt, som alltid vil være true. Du får altså ikke return-verdien til onreadystatechanged.

 

Har endret litt i sjekkEpostDb-metoden din under. Uten å gå for mye i detalj, så ser du at onreadystatechange sin returverdi ikke spiller noen rolle lengre. Siden man ikke vet når denne metoden blir kjørt, er det sjelden lurt å la resten av koden stoppe opp og vente på den.

 

function sjekkEpostDB(epost)
{
var response = null;
httpObj.open('get', '/sjekk_epost_db.php?epost='+epost, true);
httpObj.onreadystatechange=function()
{
	if(httpObj.readyState == 4)
	{			
		response = httpObj.responseText;
		//responseText er "true"(string) hvis epost finnes i databasen og "false"(string) hvis ikke.
		if(response.match("true") == null)
		{
			document.getElementById('epost_msg').innerHTML = '<div class="okMsg">OK</div>';
		}
		else
		{
			document.getElementById('epost_msg).innerHTML = '<div class="errorMsg">ERROR</div>';
		}
	}
};
httpObj.send(null);
}

Lenke til kommentar

Takker for svar. Har trikset og mikset litt, og som du sier, har jeg merket at når funksjonen sjekkEpostDB kjører, så venter ikke denne på at onreadystatechange skal bli ferdigkjørt. Er det noen måte å få denne til å gjøre seg helt ferdig før resten av koden blir kjørt?

Lenke til kommentar
(...) når funksjonen sjekkEpostDB kjører, så venter ikke denne på at onreadystatechange skal bli ferdigkjørt.

Det er fordi du ikke sier «kjør denne funksjonen nå», men «kjør denne funksjonen når jeg har fått respons fra serveren» (altså når XMLHttpRequest-objektet har state lik 'ready'). Det er dette som menes med Asynchronous Javascript and XML (AJAX). Ditt skript kjører kjører avgårde lykkelig og fornøyd, mens XMLHttpRequest kjører requesten til serveren i bakgrunnen, og kaller onreadystatechange-funksjonen når den er ferdig.

 

Du kan sette tredje argumentet i open() til false, og gjøre requesten synkron (men da er det i ordets rette forstand ikke AJAX lengre.. SJAX kanskje? :-) ):

function sjekkEpostDB(epost)
{
 var response = null;
 httpObj.open('get', '/sjekk_epost_db.php?epost='+epost, false);
 httpObj.send(null);
 if(httpObj.status == 200) {
response = httpObj.responseText;
if(response.match("true") == null) {
  document.getElementById('epost_msg').innerHTML = 
	'<div class="okMsg">OK</div>';
}
else {
  document.getElementById('epost_msg).innerHTML = 
	'<div class="errorMsg">ERROR</div>';
}
 }
 else {
alert('request failed..');
 }
}

I de fleste tilfeller er ikke dette noen god idé, blant annet fordi websiden din stopper opp mens skriptet venter på svar fra serveren. Det er bedre å hekte en funksjon på onreadystatechange, slik du hadde begynt.

Endret av Edorph
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...