WN

WN (https://www.wn.se/forum/index.php)
-   Klientsidans teknologier, design och grafik (https://www.wn.se/forum/forumdisplay.php?f=12)
-   -   Ajax + Firefox (https://www.wn.se/forum/showthread.php?t=24545)

Urme 2007-10-23 09:18

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?

Jonas 2007-10-23 11:46

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.

Urme 2007-10-23 13:22

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.

martine 2007-10-23 15:18

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.

Urme 2007-10-23 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.

Jonas 2007-10-23 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.

Urme 2007-10-23 21:16

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 :)

jonny 2007-10-23 21:21

ä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.

martine 2007-10-23 23:36

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… :rolleyes:

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;
 }
}


Urme 2007-10-24 09:12

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.


Alla tider är GMT +2. Klockan är nu 04:59.

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