FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
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] Så här ser det ut: Inputfältet: Kod:
<input type="text" id="email" name="email" class="inputtext1" onKeyUp="javascript:checkEmail(this.value);"/> (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; } } } 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? |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
Citat:
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. |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
Citat:
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. |
||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Mycket flitig postare
|
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. |
|||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Medlem
|
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.
|
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Klarade millennium-buggen
|
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.
|
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Medlem
|
Citat:
![]() |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Supermoderator
|
ä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 Zetterström se.linkedin.com/in/jonnyz | bjz.se | sajthotellet.com | kalsongkungen.se | zretail.se | zetterstromnetworks.se | webbhotellsguide.se | ekonominyheter24.se | nyamobiltelefoner.se | gapskratt.se | antivirusguiden.se | jonny.nu |
||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Mycket flitig postare
|
Citat:
![]() 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(); } 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; } } 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; } } |
|||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Medlem
|
Citat:
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:
|
||
![]() |
![]() |
Svara |
Ämnesverktyg | |
Visningsalternativ | |
|
|