Det lader til, du bruger "null" et eller andet sted, eller noget som er lig med null, som den fejlfortolker som en variable. Står der ikke noget om et linjenr.? Og kan vi evt. se koden?
Jo, kode kan du godt se. Det er noget AJAX som bruges til at opdatere en side, som henter data fra en db, som løbende bliver opdateret. Fejlen er periodisk, fremkommer sommetider kort tid efter at scriptet køres, andre gange kan der gå flere timer....
<script type="text/javascript"> <!-- var xmlHttp
function opdater() { xmlHttp=GetXmlHttpObject() if (xmlHttp==null) { alert ("Din browser understøtter ikke denne side."); return; } //hent tekst fra filen hent.asp var url="hent.asp"; xmlHttp.onreadystatechange=stateChanged; xmlHttp.open("GET",url,true); xmlHttp.send(null); }
function stateChanged() { if (xmlHttp.readyState==4) { // if "OK" if (xmlHttp.status==200) { //skriv tekst fra hent.asp til elementeter og sæt et timeout der udfører denne funktion igen om 10 sekund var xmlDoc=xmlHttp.responseXML.documentElement; var xmltjek = xmlDoc.getElementsByTagName("status")[0].childNodes[0].nodeValue; if (xmltjek==null) { setTimeout ("opdater();", 10000); } document.getElementById("status").innerHTML=xmlDoc.getElementsByTagName("status")[0].childNodes[0].nodeValue; document.getElementById("rotrpm").innerHTML=xmlDoc.getElementsByTagName("rotrpm")[0].childNodes[0].nodeValue; document.getElementById("genrpm").innerHTML=xmlDoc.getElementsByTagName("genrpm")[0].childNodes[0].nodeValue; document.getElementById("turbclock").innerHTML=xmlDoc.getElementsByTagName("turbclock")[0].childNodes[0].nodeValue; document.getElementById("geartmp").innerHTML=xmlDoc.getElementsByTagName("geartmp")[0].childNodes[0].nodeValue; document.getElementById("gen1tmp").innerHTML=xmlDoc.getElementsByTagName("gen1tmp")[0].childNodes[0].nodeValue; document.getElementById("gen2tmp").innerHTML=xmlDoc.getElementsByTagName("gen2tmp")[0].childNodes[0].nodeValue; document.getElementById("pwr").innerHTML=xmlDoc.getElementsByTagName("pwr")[0].childNodes[0].nodeValue; document.getElementById("frq").innerHTML=xmlDoc.getElementsByTagName("frq")[0].childNodes[0].nodeValue; document.getElementById("rvolt").innerHTML=xmlDoc.getElementsByTagName("rvolt")[0].childNodes[0].nodeValue; document.getElementById("svolt").innerHTML=xmlDoc.getElementsByTagName("svolt")[0].childNodes[0].nodeValue; document.getElementById("tvolt").innerHTML=xmlDoc.getElementsByTagName("tvolt")[0].childNodes[0].nodeValue; document.getElementById("rcurr").innerHTML=xmlDoc.getElementsByTagName("rcurr")[0].childNodes[0].nodeValue; document.getElementById("scurr").innerHTML=xmlDoc.getElementsByTagName("scurr")[0].childNodes[0].nodeValue; document.getElementById("tcurr").innerHTML=xmlDoc.getElementsByTagName("tcurr")[0].childNodes[0].nodeValue; document.getElementById("rctpwr").innerHTML=xmlDoc.getElementsByTagName("rctpwr")[0].childNodes[0].nodeValue; document.getElementById("enggen1sub").innerHTML=xmlDoc.getElementsByTagName("enggen1sub")[0].childNodes[0].nodeValue; document.getElementById("enggen2sub").innerHTML=xmlDoc.getElementsByTagName("enggen2sub")[0].childNodes[0].nodeValue; document.getElementById("subialtkw").innerHTML=xmlDoc.getElementsByTagName("subialtkw")[0].childNodes[0].nodeValue; document.getElementById("enggen1tot").innerHTML=xmlDoc.getElementsByTagName("enggen1tot")[0].childNodes[0].nodeValue; document.getElementById("enggen2tot").innerHTML=xmlDoc.getElementsByTagName("enggen2tot")[0].childNodes[0].nodeValue; document.getElementById("totialtkw").innerHTML=xmlDoc.getElementsByTagName("totialtkw")[0].childNodes[0].nodeValue; document.getElementById("prodtidgen1sub").innerHTML=xmlDoc.getElementsByTagName("prodtidgen1sub")[0].childNodes[0].nodeValue; document.getElementById("prodtidgen2sub").innerHTML=xmlDoc.getElementsByTagName("prodtidgen2sub")[0].childNodes[0].nodeValue; document.getElementById("prodtidsubialttimer").innerHTML=xmlDoc.getElementsByTagName("prodtidsubialttimer")[0].childNodes[0].nodeValue; document.getElementById("prodtidgen1tot").innerHTML=xmlDoc.getElementsByTagName("prodtidgen1tot")[0].childNodes[0].nodeValue; document.getElementById("prodtidgen2tot").innerHTML=xmlDoc.getElementsByTagName("prodtidgen2tot")[0].childNodes[0].nodeValue; document.getElementById("prodtidtotialttimer").innerHTML=xmlDoc.getElementsByTagName("prodtidtotialttimer")[0].childNodes[0].nodeValue; document.getElementById("vindrose").innerHTML=xmlDoc.getElementsByTagName("vindrose")[0].childNodes[0].nodeValue; document.getElementById("vindretning").innerHTML=xmlDoc.getElementsByTagName("vindretning")[0].childNodes[0].nodeValue; document.getElementById("vindstyrke").innerHTML=xmlDoc.getElementsByTagName("vindstyrke")[0].childNodes[0].nodeValue; document.getElementById("udetemperatur").innerHTML=xmlDoc.getElementsByTagName("udetemperatur")[0].childNodes[0].nodeValue; //UPDATE HYPPIGHED setTimeout ("opdater();", 10000); } else { alert("Problem retrieving XML data") }
} }
function GetXmlHttpObject() { var xmlHttp=null; try { // Firefox, Opera 8.0+, Safari xmlHttp=new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } } return xmlHttp;
} //FØRST GANG DEN LOADER SIDEN setTimeout ("opdater();", 1000); --> </script>
Problemet er desværre ikke løst. Jeg kan nu se, at fejlen opstår når en anden bruger åbner siden, altså den nye bruger forårsager en fejl på den maskine som allerede kører. Fejlmeddelelsen er den samme som før ændringen.
Har du kigget på min kode? Jeg fatter simpelthen ikke hvad der går galt. Har prøvet at ændre på flere af parametrene i javascriptet, men der sker det samme hver gang. Data bliver godt nok hentet fra en Access database, men 2 brugere må sådan en fætter vel nok kunne håndtere...
Jeg får ingen fejl på xml-siden. Alle data bliver udskrevet korrekt. Det bliver de sådan set også på siden med javascriptet. Det er opdateringen, som fejler. Siden kører igen og opdaterer et stykke tid når jeg trykker F5. Hvor længe den kører er meget forskelligt, og det er aldrig den side, der har fejlet og derefter er blevet manuelt opdateret, der fejler næste gang, men altid den anden, og vice versa, hvis du forstår hvad jeg mener. Jeg har 2 computere kørende med siden hele tiden.
Hjæææææææææææææælp please. Er der slet ingen som har nogle ideer til hvad jeg kan gøre. Evt. alternative muligheder i javascriptet. Hvis mine forklaringer er uforståelige/utilstrækkelige så spørg endelig. Det må da for pokker kunne lade sig gøre at få opdateret en side ved hjælp af AJAX. Selv om jeg godt ved at hjælpen her på Eksperten ikke afhænger af antal point, så forhøjer jeg alligevel point til 200.
Jeg tror, at jeg har fundet en forklaring på problemet. Som sagt, så fejler javascriptet kun, når det bliver kørt af mere end én computer. Jeg har lagt mærke til, at opdateringsfrekvensen, som er sat til 10000, ikke altid er præcis 10 sekunder, men sommetider 1 til 2 sekunder mere. Dermed vil opdateringstidspunktet på 2 computere på et eller andet tidspunkt blive det samme, eller næsten det samme, og det vil vel betyde, at der på den ene computer bliver foretaget et databasekald samtidig med, at den anden computer er i gang med at afvikle et tilsvarende kald. Det medfører så, at der bliver returneret en null-værdi fra det ene script med deraf følgende fejl i javascript.
Hvis jeg sætter opdateringstiden til f.eks. 20 sekunder, så kører scriptene meget længere uden at fejle, men så er sandsynligheden for at de to scripts "rammer" hinanden jo også mindre.
Løsningen kunne vel så være, at lægge en funktion ind i javascriptet, som tvinger det til at prøve at opdatere én gang til, hvis det modtager en null-værdi. Det var det jeg troede, jeg havde gjort med linjerne
if (xmltjek==null) { setTimeout ("opdater();", 10000); } men det fungerer åbenbart ikke.
Jeg spenderer altså 200 point til den, som kan fortælle, hvordan jeg sætter javascriptet til at opdatere igen, når det får en null-værdi.
Der sker kun det samme som før, altså den gule trekant med udråbstegnet i. Når jeg klikker og får fejlboksen frem, siger den, at der er en fejl i linje 37, og at fejlen er 'null' er null eller ikke et objekt. Underligt nok er fejlen stadig i linje 37. Da jeg har sat din linje ind før linje 37, skulle man vel forvente, at fejlen ville forekomme i linje 38.
Jeg har sat din linje ind her, er det hvad du mante?
var xmlDoc=xmlHttp.responseXML.documentElement; var xmltjek = xmlDoc.getElementsByTagName("status")[0].childNodes[0].nodeValue; if (!xmltjek) { setTimeout ("opdater();", 1000); } document.getElementById("status").innerHTML=xmlDoc.getElementsByTagName("status")[0].childNodes[0].nodeValue; document.getElementById("rotrpm").innerHTML=xmlDoc.getElementsByTagName("rotrpm")[0].childNodes[0].nodeValue;
Næ, det er vel derfor jeg får fejlen 'null' er null eller ikke et objekt. Null er jo ingenting. Du har læst hvornår jeg får fejlen? Jeg tror jo, at fejlen skyldes, at en bruger kalder databasen samtidig med, at en anden bruger lige har lavet et kald. Correct me if I'm wrong. Derfor vil jeg gerne have skrevet en funktion ind i javascriptet, som lige opdaterer en gang, når denne situation opstår, men det kan måske ikke lade sig gøre?
Correction: I'm quite sure, you're wrong. To af hinanden uafhængige brugere, der kalder dokumentet samtidig, burde ikke kunne skabe den fejl. Prøv at lægge et link til siden :)
- og selvom det sjældent er populært at skrive, så har innerHTML ikke noget at gøre med Ajax. Den er invalid i alle standarder og er komplet uden mening i forbindelse med XHTML. Derudover spænder den let ben for anden moderne scripting
Du får lige et link til siden. www.riishojwebsoft.dk/Turb/kontrolpanel.htm. Husk der skal være mindst 2 brugere på samtidig, før fejlen viser sig. Opdateringsfrekvens er sat til 5 sek., så fejlen vil sikkert fremkomme ret hurtigt.
Om opdateringsscriptet har noget med AJAX at gøre er jeg ret ligeglad med, bare det virker.....
Hvis fejlen afhænger af, hvormange simultane brugere, du har, kan det ikke være i browserkoden, der er fejl. Fejlen må ligge på serveren - men ikke umiddelbart i den kode, du viser ovenfor.
Et væsentligt problem ved brug af innerHTML er ikke, at det ikke virker - men at du risikerer, det ødelægger mulighederne for brug af anden kode. Ikke at det er tilfældet i dette eksempel, men hvis du senere ønsker at gøre din kode mere dynamisk, løber du let ind i problemer.
Det er godt nok underligt, at det opfører sig sådan. Fint at du kan afkræfte, at der er fejl i koden. Men jeg har prøvet at afvikle scriptet både på min egne server og på Enavns server (det link jeg opgav tidligere i tråden) og det giver samme resultat begge steder, - så snart der er mere en én bruger, som kører scriptet, fremkommer den omtalte fejl! Jeg har prøvet at enable pooling på min egen server, men det ændrede ingenting.
Nej, men der er nok omkring 2% chance for, at du får svar her nu efter 1½ måned. =) Du kan godt lade den ligge i nogle uger, jeg ville bare lige tjekke, om du havde glemt denne her.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.