Kom ihåg mig?

Ajax + Firefox

 
Ämnesverktyg Visningsalternativ
Oläst 2007-10-23, 09:18 #1
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Jag har ett formulär som kollar både om emailen är korrekt skriven och om den redan finns i databasen. Varje gång man skriver en bokstav så körs scriptet. Problemet jag har är att jag får javascriptfel i firefox i alla fall.

Förmodligen för att den inte har hunnit köra klart den första requesten när den andra görs? Har försökt söka på google men inte hittat någon lösning som jag har förstått.

Allting fungerar precis som det ska förutom att jag ibland får tillbaka ett tomt resultat, alltså ingenting skickas som jag antar beror på javascriptfelet.

Har testat i Internet Explorer 7 och där fungerar det smärtfritt, väldigt bra faktiskt.

Detta är felmeddelandet:
Kod:
uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" 
nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: javascript: eval(__firebugTemp__); :: anonymous :: line 1" data: no]
Hur ska jag ändra i ajaxkoden för att t.ex avbryta en pågående request om en ny kommer? Det borde ju lösa det?

Så här ser det ut:

Inputfältet:
Kod:
<input type="text" id="email" name="email" class="inputtext1" onKeyUp="javascript:checkEmail(this.value);"/>
Ajax-funktionen:
(Kommer utveckla denna så den inte räknar med ctrl, alt, shift tror jag)
Kod:
function createXMLHttpRequest() {
 var ua;
 if(window.XMLHttpRequest) {
  try {
   ua = new XMLHttpRequest();
  } catch(e) {
   ua = false;
  }
 } else if(window.ActiveXObject) {
  try {
   ua = new ActiveXObject("Microsoft.XMLHTTP");
  } catch(e) {
   ua = false;
  }
 }
 return ua;
}

var req = createXMLHttpRequest();

function checkEmail(email) {
	req.open("GET", "includes/ajax/newsubscriber.ajax.php?action=checkemail&email="+escape(email), true);
	req.onreadystatechange = handleCheckEmailResp;
	req.send(null);
}

function handleCheckEmailResp() {
 if(req.readyState == 4){
 if (req.responseText == "Valid!") {
 document.getElementById('validimage').innerHTML = "<img src=\"images/valid.png\" alt=\"\">";
 document.getElementById('validtext').innerHTML = "Godkänd!";
 document.getElementById('btnSave').disabled = false;
 } else if(req.responseText == "Exists!") {
 document.getElementById('validimage').innerHTML = "<img src=\"images/invalid.png\" alt=\"\">";
 document.getElementById('validtext').innerHTML = "Existerar!";
 document.getElementById('btnSave').disabled = true;
 } else if(req.responseText == "inValid!") {
 document.getElementById('validimage').innerHTML = "<img src=\"images/invalid.png\" alt=\"\">";
 document.getElementById('validtext').innerHTML = "Ej godkänd!";
 document.getElementById('btnSave').disabled = true;
 } else {
 document.getElementById('validtext').innerHTML = req.responseText;
 }
 }
}
Hittade denna sida: http://www.quirksmode.org/blog/archi...notes_a_1.html
där de tar upp problemet har provat ett par saker där men har inte fått något att fungera.

Någon som har en lösning på detta?
Urme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 11:46 #2
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Citat:
Originally posted by Urme@Oct 23 2007, 09:18
Detta är felmeddelandet:
Kod:
uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]"
nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: javascript: eval(__firebugTemp__); :: anonymous :: line 1" data: no]
Anledningen till att det fungerar smärtfritt i MSIE7 beror nog på att det inte har Firebug installerat.
Det meddelandet liknar inget "ordinärt" JS fel utan ett fel i pluginet eller i själva Firefox.
Inaktivera Firebug och se ifall du fortf. har felet i scriptet.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 13:22 #3
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Citat:
Ursprungligen postat av Jonas
Citat:
Ursprungligen postat av Urme
Detta är felmeddelandet:
Kod:
uncaught exception Exception... Component returned failure code 0xc1f30001 NS_ERROR_NOT_INITIALIZED nsIXMLHttpRequest.send
nsresult 0xc1f30001 NS_ERROR_NOT_INITIALIZED location JS frame javascript eval__firebugTemp__; anonymous line 1 data no
Anledningen till att det fungerar smärtfritt i MSIE7 beror nog på att det inte har Firebug installerat.
Det meddelandet liknar inget ordinärt JS fel utan ett fel i pluginet eller i själva Firefox.
Inaktivera Firebug och se ifall du fortf. har felet i scriptet.
Jag får inte "bara" fel i firebug, utan det blir verkligen fel, t.ex så får jag inget värde i "req.responseText" när detta dyker upp och då blir det bara blankt, tills jag skriver en till bokstav och då helt plötsligt poppar det fram. Det är ungefär som scriptet låser sig i firefox när man skickar massor av anrop snabbt efter varandra.

Inget av detta händer i MSIE7.0, då kan jag skriva 10 tecken på nån sekund och allt flyter på som det ska. Om jag gör det i Firefox får jag inte tillbaka något värde.
Urme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 15:18 #4
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Du kontrollerar ju inte om det skapade objektet redan håller på med en request. Du måste kontrollera om requesten är färdig och först då skicka en ny eller skapa ett nytt objekt som gör en till request samtidigt (ganska meningslöst). Om någon skriver snabbt så måste du alltså köa requesterna (ett bra tips är att hoppa över de första fem bokstäverna eftersom det knappast är en fullständig epostadress). Du kontrollerar inte heller om du får några felmeddelanden… (om filen var tillgänglig eller om det överhuvudtaget finns någon uppkoppling kommer du aldrig märka).

Se det som att skriva till disk eller liknande - du måste först vänta till första omgången skrivits klart och sedan skriva andra omgången, annars blir det förstås fel.

Jag köar alltid requesterna i sådana här sammanhang eftersom du annars inte ens vet vilken request du får svar på (de behöver inte nödvändigtvis komma i samma ordning som de skickas).

Att inte Explorer ger några felmeddelanden betyder inte alltid att allt är korrekt. Lita på Firefox (i de flesta fallen), den har en långt mycket bättre och avancerad felrapportering.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 16:19 #5
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Antar att det blir att läsa på mer om Ajax, kanske köra nåt framework istället för att göra allt från grunden.
Urme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 16:56 #6
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Urme: Tror inte du förstod min post tillräckligt. Felmeddelandet du visade om scriptet är ett felmeddelande som firefox ger dig ang. interna fel, det är inte ett JS fel på webben.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 21:16 #7
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Citat:
Originally posted by Jonas@Oct 23 2007, 16:56
Urme: Tror inte du förstod min post tillräckligt. Felmeddelandet du visade om scriptet är ett felmeddelande som firefox ger dig ang. interna fel, det är inte ett JS fel på webben.
Jo jag förstod det, fast det interna felet går att få bort säkert om man köar requesterna på nåt sätt
Urme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 21:21 #8
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
är det inte dumt att verifiera tecken för tecken? verifiera när du förlorar fokus eller liknande.

Framförallt kan du säkert skriva funktionen för validering direkt i javascript.
jonny är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-23, 23:36 #9
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Citat:
Originally posted by Urme@Oct 23 2007, 16:19
Antar att det blir att läsa på mer om Ajax, kanske köra nåt framework istället för att göra allt från grunden.
Lite påläsning för Ajax skadar säker inte…

Annars är det ganska lite du behöver göra ordna en funktion som sparar det som ska testas i en global variabel och testa om just den varianten har testats för att köa det hela.

Kod:
var epost = "";
var wait = false;
function nybokstav(x) {
 epost=x;
 checkEmail();
}
Funktionen nybokstav kallar du vid onkeyup.

Kod:
function checkEmail() {
if(req.readystate==0 || req.readystate==4) { //kontrollerar att antingen har ingen req ännu skickats eller så är den färdig
 req.open("GET", "includes/ajax/newsubscriber.ajax.php?action=checkemail&email="+escape(epost), true);
 req.onreadystatechange = handleCheckEmailResp;
 req.send(null);
 } else {
 wait = true;
 }
}
I handleCheckEmailResp kan du sedan kontrollera om du fått något svar om i så fall skicka nästa request:
Kod:
function handleCheckEmailResp() {
 if(req.readyState == 4 && req.status==200) { //om filen är klar och inga fel uppstått
 …
 //bearbeta svaret (som du redan har i din kod)
 …
 if(wait) { // Vi har fått svar på den första requesten och kan nu behandla vidare
 checkEmail();
 wait = false;
 }
}
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-10-24, 09:12 #10
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Urme Urme är inte uppkopplad
Medlem
 
Reg.datum: Jun 2005
Inlägg: 108
Citat:
Originally posted by jonny+--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (jonny)är det inte dumt att verifiera tecken för tecken? verifiera när du förlorar fokus eller liknande.

Framförallt kan du säkert skriva funktionen för validering direkt i javascript. [/b]

Det är väl inte optimalt att kolla efter varje tecken kanske, men en smidig funktion istället för att man måste tappa fokus först. Ska nog lägga in som någon föreslog att den börjar inte kolla om det är minimum 5 tecken iallafall. Det går nog utmärkt att lägga valideringsfunktionen i javascriptet, tänkte på det först i efterhand.

<!--QuoteBegin--martine


Annars är det ganska lite du behöver göra ordna en funktion som sparar det som ska testas i en global variabel och testa om just den varianten har testats för att köa det hela.
[/quote]

Tackar för exemplet!

Det verkar som den aldrig kör req.open etc i checkEmail dock, utan den hoppar direkt till:
} else {
wait = true;
}

och sedan fastnar den där, även vid första nerslaget.

Citat:

Function | Calls | Percent |
checkEmail | 16 | 100% |
onkeyup | 16 | 0% |
nybokstav | 16 | 0% |
Den hamnar aldrig ens i "handleCheckEmailResp", får inga javascriptsfel eller något.
Urme är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 
Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 12:33.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017