Hej, jeg sidder lige og arbejder med at hive information ud fra en xml fil, men jeg har et lille problem. I den funktion der bliver kørt når informationen fra xml-filen er modtaget (readyState 4) går der noget helt galt og jeg får meddelelsen "xmlDOM.getElementsByTagName('name')[0].childNodes[0].nodeValue has no properties"
Her er min funktion: function stateChanged() { if(xmlHttp.readyState == 4 || xmlHttp.readyState == 'complete') { var xmlDOM = xmlHttp.responseXML.documentElement;
var oP = document.createElement('p'); oP.appendChild(xmlDOM.getElementsByTagName('name')[0].childNodes[0].nodeValue); document.getElementById('content').appendChild(oP); } }
og således ser min xml fil ud: <persons> <person> <name>Elisabeth</name> <age>15</age> </person> <person> <name>Sarah</name> <age>14</age> </person> </persons>
Jeg har alt det du nævner, i min (dynamiske) xml fil. Af en eller anden grund, får jeg en anderledes fejl idag, end jeg gjorde igår, men her er filerne: http://hogalley.dk/cout/index.html , -time.phps -time.php?str=Sarah
Ja, det var det jeg mente med en ny fejl der kom - og jeg ved ikke hvorfor. Men du kan jo kigge i dens php-source fil, og se om du kan finde fejlen. Jeg er overhovedet ikke så god til DOM med php, at der er nogen chance for jeg finder fejlen.
XML tolkningsfejl: syntaksfejl adresse: http://hogalley.dk/cout/time.php?str=Sarah linje 2, kolonne 1:Fatal error: Call to undefined function: load() in /hsphere/local/home/dhare/hogalley.dk/cout/time.php on line 16
Jeg har lige kigget på de link du, Olebole, har posted og er det virkelig så meget bedre end XML? XML er jo en meget udbredt format og jeg ville da tro at hvis man bare tog nogen forholdsregler når man udarbejde sit javascript til at modtage og arbejde med xml, ville det være lige så godt som crossbrowser-json?
Da det var mig, der postede kommentaren, behøver jeg vel dårlig at svare =)
1) Ja, det er efter min og mange andres mening langt bedre. 2) JSON er efterhånden _meget_ udbredt - og udbredelsen er i dramatisk vækst. GMail og GoogleMaps er således bygget op omkring JSON. 3) Crossbrowser-JSON eksisterer ikke ... JSON _er_ crossbrowser og kan ikke være andet.
Det er jo kun hvis du har de rigtige DOM-funktioner i din PHP, at det vil virke. Hvad står der om det i en phpinfo();
Og ja, JSON vil nok være bedre i mange situationer. Jeg bruger selv JSON til noget AJAX, og XML til noget andet. Du' ved: en hammer til et som, og en skruetrækker til en skrue, selv om man sagtens kan gøre det omvendt...
Erik >> Præcis - og det er faktisk en slankere måde at serialisere et objekt/array på end PHP's egen serialize - så JSON kan også vældig fint, når noget sådan skal lægges i en cookie eller DB ;o)
Den er fantastisk søgevenlig og der er masser af udviklernoter/-idéer ved hver funktion. Kender du ikke den, så er det bare med at komme igang. Den er intet mindre end uundværlig ;o)
Disse funktioner saksede jeg iøvrigt fra Mozilla's site på et tidspunkt. De er proposals til en kommende JavaScript-version:
/* json.js 2006-10-29
This file adds these methods to java script:
array.toJSONString() boolean.toJSONString() date.toJSONString() number.toJSONString() object.toJSONString() string.toJSONString() These method produces a JSON text from a JavaScript value. It must not contain any cyclical references. Illegal values will be excluded.
The default conversion for dates is to an ISO string. You can add a toJSONString method to any date object to get a different representation.
string.parseJSON() This method parses a JSON text to produce an object or array. It can throw a SyntaxError exception.
It is expected that these methods will formally become part of the JavaScript Programming Language in the Fourth Edition of the ECMAScript standard in 2007. */
Array.prototype.toJSONString = function () { var a = ['['], b, i, l = this.length, v; for (i = 0; i < l; i += 1) { v = this[i]; switch (typeof v) { case 'undefined': case 'function': case 'unknown': break; default: if (b) { a.push(','); } a.push(v === null ? "null" : v.toJSONString()); b = true; } } a.push(']'); return a.join(''); };
Boolean.prototype.toJSONString = function () { return String(this); };
Object.prototype.toJSONString = function () { var a = ['{'], b, i, v; for (i in this) { if (this.hasOwnProperty(i)) { v = this[i]; switch (typeof v) { case 'undefined': case 'function': case 'unknown': break; default: if (b) { a.push(','); } a.push(i.toJSONString(), ':', v === null ? "null" : v.toJSONString()); b = true; } } } a.push('}'); return a.join(''); };
String.prototype.parseJSON = function () { try { if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(this)) { return eval('(' + this + ')'); } } catch (e) { } throw new SyntaxError("parseJSON"); };
String.prototype.toJSONString = function () { if (/["\\\x00-\x1f]/.test(this)) { return '"' + this.replace(/([\x00-\x1f\\"])/g, function(a, b) { var c = m[b]; if (c) { return c; } c = b.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }) + '"'; } return '"' + this + '"'; };
})();
Med dem kan du serialisere f.eks. et JS-objekt som en JSON-streng: var o = {et:"en værdi", to:"en anden værdi", tre:["en", "to", "tre"]}; alert(o.toJSONString());
- og du kan bruge parseJSON-metoden til at parse en JSON-streng, så du får et JS-objekt i stedet
Well, den spørg om jeg vil downloade php filen, filen vises ikke, men kommer op i en download-dialog hvor den spørg om jeg vil gemme den/åbne den eller anullere ... og det er efter jeg tilførte filerne fra den der library-mappe over i en mappe der hedder "json" og jeg "require_once('json/json.php');" i toppen af php filen.
Det kan jeg desværre ikke, da jeg ikke har php 5+ på nogen af mine online servere, kun på min computer som kun mig selv har tilgang til.
Men jeg har lige prøvet igen... Det eneste jeg har gjort er at paste php-koden fra artiklen (http://www.eksperten.dk/artikler/1053) og så tager alle mapper og filer og smide en mappen "json" som ligger i samme mappe som phpfilen gør.
Hehe ... næhhh, det er din browser, der ikke forstår det. Du kan ikke kalde et JSON-dokument direkte i en browser, når det sendes med den korrekte MIME-type ;o)
Sørme så... Den hentede det helt perfekt, yeah:D Men noget der bekymre mig lidt er, at det umuligt kan være smart hvis alle og enhver bare kan gå ind på phpdokumentet(af typen text/json) og så bare downloade den?
Argh, så er det jo ikke noget problem. Eller er det? Hvad sker der hvis man skal transportere ting som passwords og sådan, fra en database. Så kan folk jo også få fat i dem, ved bare at gætte sig frem til filens navn?
Og når man snakker om at lagre information (database(hvis ja, hvilke?), xml og sådan) Hvilken vej (hvis ikke alle vejene er lig hinanden) skal man så gå? Hvilke har flest fordele og sådan?
Og så har jeg lige opdaget at JSON ikke er så venlig mod æ, ø og å. Hvordan klarer man den? Bare noget replacement med ae>æ,oe>ø&aa>å eller er der en mere praktisk fremgangsmåde?
Du skal altid sørge for, at hele kæden kører med samme charset. Det gælder DB, server og dokumenter (din Content-type meta i head-elementet). Endvidere skal du sørge for at gemme filen i det rigtige format ... utf-8, hvis du bruger utf-8 og ANSII, hvis du bruger iso-8859-1
Det er faktisk bare det mesteren her (http://www.eksperten.dk/artikler/1053) instroducere jeg har kopieret ind. Andet er det såmænd ikke. Men det går ikke at jeg går videre, hvis jeg ikke engang kan arbejde med hele det danske alfabet:P
Yeah, og det jeg gjorde dig bare opmærksom på det, så jeg var fri for at sige hvad der står i JSON strengen eller give dig et link. Men det må jo være noget med der skal sættes noget tegnsætning i php->json filen, for jeg har i min html fil.
Jeg er lidt i tvivl med JSON filen, men min HTML er iso-8859-1 ... Problemet er det Notepad++ ikke giver mig mulighed for at vælge om det skal være anci osv. når jeg gemmer filen, men JSON filen og HTML filen er gemt på samme måde, så mon ikke de er ens?
Jeg tror, Zend-tingene kører utf-8, hvilket nok er det, der bliver mere og mere fremherskende (også i sprogenes streng-funktioner, m.m).
Prøv at skrive denne meta i dit HTML-dokument: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- og sørg for, det er gemt som utf-8. Hvis du ikke ved, hvordan, så åben det i Notesblok og vælg 'Gem som...' - og vælg dér den rette kodning for neden.
Erik, kig i ovenstående artikel, der er JSON koden:P
Jeg ville ønske, Ole, jeg kunne vise jer det. Det er ikke pænt at modstride folk der prøver at hjælp. Men jeg har desværre ingen online server der har php5+.
Der ku' være en fidus i at prøve lastName i stedet for firstName. Tror du Zend har hørt om andet end 7-bits tegn, Ole? ;) Jeg føler mig sat 15-20 år tilbage i tiden - dengang de rabiate programmører på Island brokkede sig højlydt, når deres sjove tegn ikke kunne bruges.
Mit problem, Ole, er at Joergens bliver udskrevet som Joergensen, men Jørgensen som J. Hvilket ikke er særligt hensigtsmæssigt, hvis dette lille script var noget der faktisk skulle bruges til noget:)
det er bare koden fra artiklen (http://www.eksperten.dk/artikler/1053) jeg har pasted ind og så øndret Joergensen til Jørgensen, hvor den lille bug så dukkede op.
Det siges om Zend JSON: "Does not convert string data: it is up to the user to take care about conversion to the desired charset" Kilde (kender ikke troværdigheden, eller hvor opdateret den er): http://gggeek.altervista.org/sw/article_20061113.html
At beslutte sig for - og fastlægge sig på - et tegnsæt er ikke helt let nu om stunder ... men det er fedt, når man har gjort det. Det er bare noget rod, når man ikke kan se, hvad der sker - og personen i den anden ende ikke er særlig erfaren (no offence!) =)
Well, jeg er ikke særlig erfaren med php og DOM, det må jeg blankt erkende. Men hej, jeg er allerede blevet en lille smule bare erfaren på det her område, ved hjælp af jer:D Det virker ihvertfald nu:)
Jeg vil lige se om jeg igen kan komme af sted off-topic spørgsmål, som kommer af jeg leger med det projekt denne tråd er om.
Hvorfor kan jeg ikke sige (xmlHttp indeholde min XHR) if(xmlHttp.readyState < 4) {} og så derinde sætte en "Loading" effekt frem og så bagefter når readystate er lig 4, fjerne det igen? Det virker ikke helt efter hensigten; jeg får 4 loading effekter. Jeg har også prøvet med readystate lig 0, men der får jeg overhovedet ingen. Hvor skal jeg kalde loading effekten henne?
Jeg tænkte på om i 2 gutter kender nogen gode DOM (eller AJAX, så jeg er godt dækket ind) reference sider, så jeg er fri for at sidde og google tonsvis af ord før jeg finder netop den funktion (i dette tilfælde removeChild - og kun 2 ord) jeg leder efter?
Hvis du har fyldt data i et div ... f.eks. bestående af linjer - igen bestående af div med noget tekst i. Det kunne være data om en bruger ... navn, adresse, telefon, køn eller ej, fodsvamp, osv.
Så kalder brugeren serveren og vil gerne have fyldt nye data i display'et. Så renser vi det ydre div med:
while (ELEMENT.firstChild) { ELEMENT.removeChild( ELEMENT.firstChild ); }
Du har helt ret ... removeNode bør man ikke bruge. Vi misforstår vist bare hinanden ;o) En anden god metode at kende er cloneNode. Bliver den kaldt med true som argument, returnerer den en klon af elementet med alle dets child-elementer. Prøv f.eks. denne kode, hvor jeg opretter en skabelon på onload - og derefter bruger den, når jeg skal indsætte rækker:
<script type="text/JavaScript"> var oRow = {fornavn:"Ole", efternavn:"Clausen", alder:52, fodsvamp:"ikke for tiden"};
function insertRow(oRow) { var o = oTempl.cloneNode(true); var aTD = o.getElementsByTagName("td"); aTD[0].firstChild.nodeValue = oRow.fornavn; aTD[1].firstChild.nodeValue = oRow.efternavn; aTD[2].firstChild.nodeValue = oRow.alder; aTD[3].firstChild.nodeValue = oRow.fodsvamp; oBody.appendChild(o); }
var oBody = oTempl = null; window.onload = function() { oBody = document.getElementById("myBody"); var o = oBody.getElementsByTagName("tr")[0]; oTempl = o.cloneNode(true); oBody.removeChild(o); o = null; } </script>
I øvrigt har jeg selv disse liggende fast i min standard HTML-template:
var d=document; function gE(id){return d.getElementById(id)}; function gA(o,t){return o.getElementsByTagName(t)}; function cE(t){return d.createElement(t)};
o = gE("mitDiv"); => o = document.getElementById("mitDiv");
a = gA(ELEMENT, "div") => a = ELEMENT.getElementsByTagName("div");
o = cE("div") => o = document.createElement("div");
- så slider den aldrende programmør ikke så meget på sine små, rynkede pizzatænger, når han DOM'er
Well det kan man vel også, hvis man er ved at runde de 60, Ole;) Jeg har også altid brugt dynamiske funktioner så jeg var fri for at skrive ting der tit skal bruges, igen og igen:)
Ja, hvis du f.eks. loader mange brugere i en tabel på baggrund af et databasetræk ... det var bare et eksempel med det ene brugerobjekt. Der ville typisk være tale om et array af objekter ;o)
...jeg har nemlig lavet en lille tab-funktion, men den lagger lidt. Altså nogen gange hvis man trykker på en ny tab lige efter man har trykket på en, kommer der ingen "loader" frem, men istedet ser man bare den side man lige har skiftet til, indtil den nye side er loaded. Og så kunne det jo være du lige kunne kigge på det, for at hjælpe en lille baby på vejen til at vokse sig stor DOM-scripter:P
Ærgeligt ... Jeg har www.hogalley.dk hos surftown men det er noget ustabilt hvis der er meget traffik og så er der kun php 4. Så jeg tror jeg skal have købt mig noget nyt:)
Okay ... det sker, fordi den første side fjerner loader-divet ;o)
Du kan sætte en global variabel til 0: <script type="text/JavaScript"> var nHttpInst = 0; ... osv - osv ...
Den bruger du til at se, om der er åbne forbindelser til serveren.
Når du sender en forespørgsel, skriver du: xmlHttp.send(); document.getElementById("myLoader").style.display = "block"; nHttpInst++; // Vi tæller den én op
Når du modtager data skriver du: if(xmlHttp.readyState == 4) { nHttpInst--; // Vi tæller den én ned if (nHttpInst<1) document.getElementById("myLoader").style.display = "none"; }
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.