Permalänk
Medlem

Två javascript stör varandra

Jag har en sida med två javascript (eller AJAX-script om man kan säga så) och de funkar var och en för sig men inte tillsammans.

Script 1: körs från en dropdownmeny som används för att välja vilken text man vill se (från extern textfil).
Script 2: när man ser en text kan man redigera den och spara, javascriptet skickar då texten till en php-fil som sparar i bakgrunden, very AJAX.

Som sagt, båda funkar var för sig. Det går bra att bläddra bland texterna, ändra en och spara. Men sen är det stopp, när en text är sparad så går det inte att få fram en ny.

Jag tror att det är de här raderna kod som krånglar men är inte alls säker på det, ser inget fel (och det funkar ju i början plus att allt är rippat från w3schools och de borde ju veta):

xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("rutan").innerHTML=xmlhttp.responseText; } }

Nånstans tappar scriptet bort sig på nåt sätt. Det vet vad "rutan" innehåller och vilken text som borde finnas där istället (har testat med alerts) men inget händer.

Hoppas nån har nån idé!

Permalänk
Medlem
Skrivet av Meat:

Jag har en sida med två javascript (eller AJAX-script om man kan säga så) och de funkar var och en för sig men inte tillsammans.

Script 1: körs från en dropdownmeny som används för att välja vilken text man vill se (från extern textfil).
Script 2: när man ser en text kan man redigera den och spara, javascriptet skickar då texten till en php-fil som sparar i bakgrunden, very AJAX.

Som sagt, båda funkar var för sig. Det går bra att bläddra bland texterna, ändra en och spara. Men sen är det stopp, när en text är sparad så går det inte att få fram en ny.

Jag tror att det är de här raderna kod som krånglar men är inte alls säker på det, ser inget fel (och det funkar ju i början plus att allt är rippat från w3schools och de borde ju veta):

xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("rutan").innerHTML=xmlhttp.responseText; } }

Nånstans tappar scriptet bort sig på nåt sätt. Det vet vad "rutan" innehåller och vilken text som borde finnas där istället (har testat med alerts) men inget händer.

Hoppas nån har nån idé!

Problemet är att du troligtvis får exakt samma xmlhttp-objekt. Jag ska leta i min kodsamling för snabblösningen om ingen annan hinner före.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Argh.. Hittade inte, men ungefär på detta vis ser det ut.

function getXMLHttpObject() { if (window.XMLHttpRequest) return new XMLHttpRequest(); else if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP') else return null; } var xmlhttp = getXMLHttpObject();

Kör den sista raden innan du meckar. Ha inte globala variabler.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Argh.. Hittade inte, men ungefär på detta vis ser det ut.

function getXMLHttpObject() { if (window.XMLHttpRequest) return new XMLHttpRequest(); else if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP') else return null; } var xmlhttp = getXMLHttpObject();

Kör den sista raden innan du meckar. Ha inte globala variabler.

Med andra ord bör man skapa request-objektet lokalt i en funktion enligt nedan.

function doSomething() { var xmlhttp = getXMLHttpObject(); ... }

Där alltså doSomething() säkert kan anropas via onmouseover, onclick etc.

Utifall att du inte redan gör det, så börja fånga undantag när skripten krånglar. Att "inget händer" brukar enligt min erfarenhet ofta innebära att något undantag kastats. Ett bra förfarande är således att fånga undantaget och trycka ut et på en popup-ruta. Den information man får fram där brukar underlätta felsökning betydligt.

function doSomething() { try { ... } catch (e) { if (debug) { // global boolean, sätts lämpligen till false i skarp version alert(e); } } }

Permalänk
Medlem
Skrivet av Atomizer:

Med andra ord bör man skapa request-objektet lokalt i en funktion enligt nedan.

function doSomething() { var xmlhttp = getXMLHttpObject(); ... }

Där alltså doSomething() säkert kan anropas via onmouseover, onclick etc.

Utifall att du inte redan gör det, så börja fånga undantag när skripten krånglar. Att "inget händer" brukar enligt min erfarenhet ofta innebära att något undantag kastats. Ett bra förfarande är således att fånga undantaget och trycka ut et på en popup-ruta. Den information man får fram där brukar underlätta felsökning betydligt.

function doSomething() { try { ... } catch (e) { if (debug) { // global boolean, sätts lämpligen till false i skarp version alert(e); } } }

Precis. Det är så lätt att hamna i problem med globala variabler om man inte gör metoder av det man vill göra. Jag vill tillägga att med jQuery så är det enklare att göra rätt men det är aldrig fel att lära sig hur man gör det på "rätt sätt" från början. Väldigt bra sätt att lära sig problematiken mellan olika browsers.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Tack för alla svar! Jag har ändrat lite men tyvärr blir det inte bättre.

Nu ser koden ut så här:

function getXMLHttpObject() { if (window.XMLHttpRequest) return new XMLHttpRequest(); else if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP') else return null; } function byttext(textattvisa) { // har även testat skicka med slumptal till textattvisa // för att tvinga fram ny inläsning var xmlhttp = new getXMLHttpObject(); // testat utan "new" också men det verkar kvitta (?) xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("rutan").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET",textattvisa,true); // testat med POST också xmlhttp.send(); } function sparatext(textattspara,filattsparatill) { var xmlhttp = new getXMLHttpObject(); xmlhttp.open("POST","sparatext.php",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("text="+textattspara+"&fil="+filattsparatill); }

Har kollat lite på scriptverktygen i Firebug men jag är ganska ny på javascript och vet inte riktigt vad jag letar efter.

Permalänk
Medlem
Skrivet av Meat:

Tack för alla svar! Jag har ändrat lite men tyvärr blir det inte bättre.

Nu ser koden ut så här:

function getXMLHttpObject() { if (window.XMLHttpRequest) return new XMLHttpRequest(); else if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP') else return null; } function byttext(textattvisa) { // har även testat skicka med slumptal till textattvisa // för att tvinga fram ny inläsning var xmlhttp = new getXMLHttpObject(); // testat utan "new" också men det verkar kvitta (?) xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("rutan").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET",textattvisa,true); // testat med POST också xmlhttp.send(); } function sparatext(textattspara,filattsparatill) { var xmlhttp = new getXMLHttpObject(); xmlhttp.open("POST","sparatext.php",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("text="+textattspara+"&fil="+filattsparatill); }

Har kollat lite på scriptverktygen i Firebug men jag är ganska ny på javascript och vet inte riktigt vad jag letar efter.

Det ska inte vara "new getXMLHttpObject()" i detta fall.
Kör du Firefox när du testar?
Vad står det i Error Console?

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Det ska inte vara "new getXMLHttpObject()" i detta fall.
Kör du Firefox när du testar?
Vad står det i Error Console?

Ok, det är borta nu.
Japp, Firefox. Error console är tom (förutom ett css-fel). Fattar inte

Kan det vara så att websidan skickar med fel värden på nåt sätt? Jag har iofs testat med alerter och det ser rätt ut...

Permalänk
Medlem

Jag har nu fått reda på att javascripten funkar i Chrome. Vad kan det tyda på?

(hoppas ok att jag skriver i min gamla tråd igen)