Avatar billede HBechJ Nybegynder
20. april 2013 - 16:40 Der er 21 kommentarer og
1 løsning

XML data i JavaScript

Hej

Jeg har dette lille javaScript der skifter et objekt efter værdien på en dynamisk variaben. Det har virket helt fint. men nu ligger den variaben "status" i en XML fil, den er stadig dynamisk.

Hvordan får jeg data fra XML filen inde i mit javaScript? Tror jeg skal ud i noget AJAX.

java script:

function test() {
        var status = status;
        var cirkel = document.getElementById("IDnavn");
       
        if(status == 0) {
            cirkel.className = "prik1";
        } else {
            cirkel.className = "prik2";
        }
      }

CSS:

      .prik1 {
        height: 15px;
        width: 15px;
        border-radius: 8px;
        border: solid 1px;
        background-color: green;
        float: left;
        margin: 5px;
      }
      .prik2 {
        height: 15px;
        width: 15px;
        border-radius: 8px;
        border: solid 1px;
        background-color: red;
        float: left;
        margin: 5px;

HTML:
<div id="IDnavn"></div>
Avatar billede thomas Praktikant
20. april 2013 - 16:54 #1
Du skal konvertere din XML til JSON. Det gør at du meget nemt kan bruge det i dit javascript.

Se f.eks. http://davidwalsh.name/convert-xml-json og der giver gode råd og eksempler.
Avatar billede HBechJ Nybegynder
20. april 2013 - 17:25 #2
Tak for det hurtige svar, vil jeg kigge nærmer på.

Hvordan forholder JASON sig med dynamisk indhold?
indholdet af XML filen skifter hver 1min.
Avatar billede thomas Praktikant
20. april 2013 - 18:06 #3
Det nemmeste er nog at hente det vær gang nogen besøger siden. Om det skal opdateres "live" på siden kan du bruge AJAX og hente det med en funktion der kører en gang i minutten. Man skal dog huske at man ikke kan hente filer på en anden server med AJAX, så XML filen skal findes lokalt på servern.

Om det er en meget stor XML fil der skal læses kan det blive lidt tungt at køre det vær gang nogen vil vise det.
Avatar billede HBechJ Nybegynder
20. april 2013 - 18:15 #4
Filen ligger lokalt på serveren og den er ikke særlig stor.

Jeg har et ajax script som henter data'en og viser den på side, dette ajax script bliver kaldt hver 10sek.

Men der fra og til at få det ind i mit JS er jeg desværre ldit fortabt.
Avatar billede olebole Juniormester
20. april 2013 - 22:06 #5
<ole>

Undskyld, men hvad skulle fordelen være ved at konvertere ét dataformat til et andet, når begge uden problemer kan anvendes i forbindelse med JavaScript? Hvorfor oversætte til JSON? Hvorfor ikke bare bruge XML?

/mvh
</bole>
Avatar billede HBechJ Nybegynder
20. april 2013 - 22:13 #6
For mig ville det absolut være en fordel hvis jeg slipper for delen hvor jeg konvertere det til JSON.

Men hvordan går jeg det fra mit ajax ind i en anden javascript funktion?
Avatar billede HBechJ Nybegynder
20. april 2013 - 22:25 #7
Dette er måden jeg loader data fra min XML fil, det er ID = I1 fra min xml fil jeg gerne vil have over i var status = status (I1 i XML fil.

Men jeg har svært ved at finde en måde og sammen koble de to ting.

function loadXML()
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    xmlDoc=xmlhttp.responseXML;
    document.getElementById("I1").innerHTML=
                xmlDoc.getElementsByTagName("I1")[0].childNodes[0].nodeValue;
    setTimeout('loadXML()',1000);
    }
  }
xmlhttp.open("GET","http://192.168.0.1/test.xml",true);
xmlhttp.send();
}
Avatar billede olebole Juniormester
20. april 2013 - 22:32 #8
Det er vel bare:

status = xmlDoc.getElementsByTagName("I1")[0].childNodes[0].nodeValue;

- og så skal du nok undgå caching med:

var uniq = new Date().getTime();
xmlhttp.open("GET", "http://192.168.0.1/test.xml?u="+uniq, true);
Avatar billede HBechJ Nybegynder
20. april 2013 - 22:39 #9
Ok var usikker på om det kunne løses på den måde, det tester jeg imorgen.

Ok har du mulighed for at forklare hvordan det virker og hvorfor de to linjer med caching skal indsættes.
Avatar billede HBechJ Nybegynder
20. april 2013 - 23:29 #10
Tror måske jeg har fanget det. Det er for at sikre den tager den værdien fra XML filen, og ikke bare fra en cachs fra klienten?
Avatar billede olebole Juniormester
20. april 2013 - 23:57 #11
Det skulle virke under forudsætning af, at du et eller andet sted udenfor funktioner har erklæret variablen med var status; ... og måske sat den til noget.

Du kan også kalde en funktion fra XHR-handleren og sende værdien med som argument:

var arg = xmlDoc.getElementsByTagName("I1")[0].childNodes[0].nodeValue;
myNiftyFunction(arg);

- hvis det er mere hensigtsmæssigt i din struktur.
Avatar billede olebole Juniormester
21. april 2013 - 00:04 #12
#10: Ja, browseren tror - grundet timestamp'et - der er tale om et nyt dokument, hvergang open-metoden kaldes. Derfor gennemtvinges en ny serverforespørgsel i stedet for en hentning fra lokal cache.

Du bør i øvrigt overveje, hvor ofte du har brug for opdatering. Selvom du ikke lægger mærke til kald, der køres i baggrunden, bruges der både lokal- og server-CPU og -RAM, ligesom du skaber trafik begge veje.

Opdater så ofte det er nødvendigt, men undlad at gøre det oftere  *o)
Avatar billede HBechJ Nybegynder
21. april 2013 - 00:20 #13
#11
Hvor i min kode skal jeg definere "var = status"; skal dette være i min AJAX eller JS funktion? og hvor i script'et skal det stå?

Kan du uddybe det med XHR-handleren, og hvad fordelen er ved at bruge denne løsning. Jeg kan ikke rigtig finde noget på det på nettet.

#12
Ok, det var også sådan jeg troede det fungerede.

Du har helt sikkert ret, og hardwaren web serveren køre på er på ingen måde det kraftigste.

Beklager jeg skal have det uddybet sådan, det skal næsten være scripting for dummies.
Avatar billede olebole Juniormester
21. april 2013 - 01:06 #14
Variablen status skal erklæres et eller andet sted i koden udenfor alle funktioner. Den skal være såkaldt 'globalt' erklæret. Skriver du:

function foo() {
    var bar = "noget";
}
foo();
alert(bar);

- så vil du få en fejl. Variablen bar er erklæret lokalt - inde i funktionen foo. Den kan kun 'ses' inde i funktionen selv. Variablen kan ikke 'ses' udenfor funktionen. Den er lokal.

Skriver du derimod:

var bar;
function foo() {
    var bar = "noget";
}
alert(bar);
foo();
alert(bar);

Her erklærede jeg bar udenfor funktionen, hvorfor den kan ses overalt - både indenfor og udenfor alle funktioner. Den er global.

Derfor returnerer den første alert "undefined". Vi havde jo kun erklæret variablen, men ikke tildelt den en værdi. Til gengæld udløses ikke en fejl. Værdien er blot ikke-defineret.

Den anden alert kaldes, efter kaldet til funktionen og returnerer derfor "noget". Variablen kunne ses inde i funktionen, og dens værdi blev derfor ændret ved funktionskaldet.

XHR står for XMLHttpRequest. Når jeg skriver XHR-handleren, mener jeg den funktion, der håndterer responsen fra dit XHR-object - altså den funktion, du skriver på højre side af lighedstegnet her:

xmlhttp.onreadystatechange = function()

Inde i dén funktion kan du skrive funktionskaldet. Der, hvor du nu sætter et elements innerHTML.
Avatar billede olebole Juniormester
21. april 2013 - 01:12 #15
PS: Når jeg ikke skriver den færdige funktion, er det ikke for at få dig til at 'dumme' dig. Det er for at få dig til at tænke og prøve selv. Lykkes det for dig, vil du bedre kunne huske, hvad du gjorde - og hvorfor.

Lykkes det ikke, er det eneste dumme spørgsmål stadigvæk det, du ikke stiller! Bare spørg løs  =)
Avatar billede HBechJ Nybegynder
21. april 2013 - 01:28 #16
#14. Ok det er fordi det skal være globale variabler, det giver jo god mening så jeg kan bruge den i begge funktioner.

Havde ikke lige koblet XMLHttpRequest sammen med forkortelsen XHR, men det giver jo god mening.

#15. Hehe det syntes jeg absolut er helt i orden.

Jeg vil teste det i morgen så kommer jeg med en tilbage melding om det lykkes for mig.
Avatar billede olebole Juniormester
21. april 2013 - 01:31 #17
*LoL* Sorry, jeg lavede en slem, slem fejl i #14 - men fint, så tager vi den med  *D

I denne kode:

var bar;
function foo() {
    var bar = "noget";
}
alert(bar);
foo();
alert(bar);

- erklærer jeg faktisk to forskellige variabler. Først erklærer jeg en global. Når jeg så kalder funktionen foo, opretter jeg en ny, lokal variabel med samme navn inde i funktionen - og det er dén, jeg sætter til: "noget". Den globale variabel rører jeg derimod  ikke ved.

Derfor vil begge alerts i det eksempel returnere "undefined".

Skriver jeg derimod:

var bar;
function foo() {
    bar = "noget";
}
alert(bar);
foo();
alert(bar);

- uden var vil de to alerts returnere "undefined" og "noget".

Du kan altså godt have både globale og lokale variabler med samme navn, når de både i det globale og et lokalt scope er erklæret med nøgleordet var. Det kan absolut ikke anbefales, da der let opstår sammenblanding.

Undskyld roderiet, men så fik du da om ikke andet uddybet problematikken yderligere  =)
Avatar billede HBechJ Nybegynder
22. april 2013 - 10:38 #18
Hej

Så har jeg fået testet det, og det virker desværre ikke.

status = xmlDoc.getElementsByTagName("I1")[0].childNodes[0].nodeValue;

Jeg får denne fejl
"Uncaught ReferenceError: xmlDoc is not defined"
Avatar billede olebole Juniormester
22. april 2013 - 14:53 #19
Det lyder, som om du skriver en forkert sti til XML-filen. Prøv at vise koden
Avatar billede HBechJ Nybegynder
22. april 2013 - 20:14 #20
Jeg har fået det til at virke nu, jeg definere "status" som en global variabel som det første. og de sætter jeg værdien af statis i mit ajax,

    var status;
function loadXML()
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    xmlDoc=xmlhttp.responseXML;
    document.getElementById("test1").innerHTML=
                xmlDoc.getElementsByTagName("test1")[0].childNodes[0].nodeValue;
    status =
                xmlDoc.getElementsByTagName("test1")[0].childNodes[0].nodeValue;
    setTimeout('loadXML()',1000);
    }
  }
var uniq = new Date().getTime();
xmlhttp.open("GET", "http://192.168.167.202/awp/WEB/DB.xml?u="+uniq, true);
xmlhttp.send();
}

Så virker det helt perfekt.

olebole vil du ikke smide et svar, så får du point, og rigtig mange tak for hjælpen og tips omkring caching
Avatar billede olebole Juniormester
22. april 2013 - 20:46 #21
Ellers tak, jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes  =)
Avatar billede HBechJ Nybegynder
22. april 2013 - 20:55 #22
ok :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester