[XML/DOM/JS] undefined in Firefox

Pagina: 1
Acties:

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Beste meedenkers...

Ik kom er echt niet uit en zit de halve nacht al te puzzelen. Ik ben bezig met een script die alle gegevens uit een xml bestand in een mooi tabelletje zet.
Echter, het werkt prachtig in IE, alleen toen ik het gister een vriend wilde laten zien werkte niet, want hij had FF. Alle cellen van de tabel werden bij hem gevuld met 'undefined'.

JavaScript:
code:
1
2
3
4
5
6
var id = thread.attributes.getNamedItem("id").value;
var subject = thread.getElementsByTagName("subject").item(0).text;
var date_created = thread.getElementsByTagName("datecreated").item(0).text;
var date_closed = thread.getElementsByTagName("dateclosed").item(0).text;
var user = thread.getElementsByTagName("handle").item(0);
var guest = thread.getElementsByTagName("guest").item(0);

Met het XML bestand is ten eerste niks mis, die wordt netjes ingeladen, want id laat hij wel goed zien (dat is een attribuut van de hoofdtag). De variabelen user en guest gaan ook goed.

Alleen subject en date_created gaan niet goed. Om de waarde tussen die tags te halen gebruik ik in IE .text, maar dat werkt dus niet in FF. Hoe kan ik dit anders oplossen??

PS. Hierbij ook een stukje van de XML:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<thread id='55'>
        <subject>testjahh</subject>
        <datecreated>1160735263</datecreated>
        <dateclosed>0</dateclosed>
        <user id='7031'>
                <user>pietjah</user>
                <name>Piet piet</name>
                <email>me@pietjah.com</email>
       </user>
       <guest id='0'></guest>
       <admin id='0'></admin>
       <message id='40'>
            <name>Piet piet</name>
            <email>me@pietjah.com</email>
            <message>test</message>
       </message>
</thread>

  • DLGandalf
  • Registratie: Maart 2005
  • Laatst online: 29-11 13:12
umm al had je even gezocht:
http://www.w3schools.com/dom/dom_node.asp

dan zie je dat .text een IE-only eigenschap is

al kijk je even verder op die site die ik je net geef dan zie je dat je iets met nodeValue moet doen

(let op, firefox heeft nog een groot verschil met IE, namelijk een lege textNode na elke tag, dat is nl de nieuwe regel
dus bv
<tag> [met parsen zou hier de lege text node staan als kind van <tag>]
je data
</tag>
Dit laatste weet ik niet helemaal meer zeker maar je moet t wel even opzoeken want het is erg frusterend als je alleen maar lege text-nodes terugkrijgt als je via children[0] werkt.

//edit
om het zoeken te vergemakkelijken via google of wat dan ook die lege text nodes worden door vele ghost-nodes genoemd
succes

[ Voor 9% gewijzigd door DLGandalf op 11-11-2006 10:15 ]


  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06 20:43
Wellicht dat het nalezen van de officiele DOM referentie van het W3C helpt:
http://www.w3.org/TR/2000...3/core.html#ID-1950641247

Maar goed, ik zal het je iets gemakkelijker maken. :) Probeer ipv het (voor zover ik kan zien) proprietairy en dus ook deprecated 'text' eens de 'nodeValue' property.

En misschien is het wel handig om tijdens het ontwikkelen van je code gelijk Fx en Opera te checken - door het namelijk gelijktijdig in alle 3 de browsers te checken kom je veel sneller achter dit soort ontwerpfouten die Internet Explorer zitten...

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:25

Creepy

Tactical Espionage Splatterer

En aangezien we het hier over Javascript hebben: move naar Webdesign, Markup & Clientside Scripting.
Zie ook Waar hoort mijn topic?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

element.firstChild.nodeValue

Intentionally left blank


  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Sorry was vergeten te vermelden dat ik het met nodeValue ook al heb geprobeerd, maar ik dacht dat ik daarmee in een hele verkeerde hoek zat omdat ik daarbij alleen maar meer foutmeldingen kreeg.

var subject = thread.getElementsByTagName("subject").item(0).firstChild.nodeValue;

geeft: thread.getElementsByTagName("subject").item(0).firstChild has no properties.

En aangezien het een intern programma is dat alleen in IE gebruikt zal worden, heb ik het ook verder niet in FF getest. Maar vond het toch leuk om te proberen het te laten werken.

Ik zal eens wat verder zoeken op die W3Cschools.

--EDIT--
Ik heb inmiddels dat de ondestaande regel geen foutmelding geeft in FF, maar een lege string. Maar in IE krijg ik dan overal null te zien...

var subject = thread.getElementsByTagName("subject").item(0).nodeValue

[ Voor 15% gewijzigd door RickyHeijnen op 11-11-2006 12:08 ]


  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Ik heb een oplossing gevonden... alhoewel een oplossing, het werkt nog steeds niet helemaal. Ik heb 2 functies gemaakt om de XML in te laden welke in beide browsers zou moeten werken:

JS:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function loadXMLDoc() {
        var url = "/test/index.php?action=loadxml";

        if(window.XMLHttpRequest) {
                req = new XMLHttpRequest();
                req.onreadystatechange = processReqChange;
                req.open("GET", url, true);
                req.send(null);

        }
        else if(window.ActiveXObject) {
                req = new ActiveXObject("Microsoft.XMLHTTP");
                if (req) {
                        req.onreadystatechange = processReqChange;
                        req.open("GET", url, true);
                        req.send();
                }
        }
}

function processReqChange() {
        if(req.readyState==4 && req.status==200){
                        alert(req.responseText);
                        alert(req.responseXML);
                        alert(req.responseXML.documentElement);
                }
        }
}


Vervolgens heb ik daar 3 alertjes bijgezet die mij het resultaat tonen. En daarbij krijg ik de volgende output:

alert1 - responseText:
code:
1
2
3
4
5
6
7
8
9
10
11
12
< ?xml version="1.0"?>
                <process>
                     <handles_total>5956</handles_total>
                     <handles_processed>111</handles_processed>
                     <invoices_generated>24</invoices_generated>
                     <net_amount>4023.85</net_amount>
                     <vat_amount></vat_amount>
                     <perc>2</perc>
                     <time1>00:17</time1>
                     <time2>14:55</time2>
                     <status>running</status>
                </process>


alert2 - responseXML:
code:
1
[object]


alert3 - responseXML.documentElement:
code:
1
null


Op een of andere manier laad hij de file wel goed in en de XML ziet er netjes uit. Echter... als ik hem met responseXML laad en er een documentElement van maak krijg ik 'null' als resultaat.

Is mijn code niet XML-valid??

Ik heb o.a. deze tutorial gebruikt: http://www.ajaxtutorial.n...th-php-using-responsexml/

  • Spleasure
  • Registratie: Juli 2001
  • Laatst online: 26-10 16:56

Spleasure

Ik hier?

DLGandalf schreef op zaterdag 11 november 2006 @ 10:14:
(let op, firefox heeft nog een groot verschil met IE, namelijk een lege textNode na elke tag, dat is nl de nieuwe regel
dus bv
<tag> [met parsen zou hier de lege text node staan als kind van <tag>]
je data
</tag>
Dit laatste weet ik niet helemaal meer zeker maar je moet t wel even opzoeken want het is erg frusterend als je alleen maar lege text-nodes terugkrijgt als je via children[0] werkt.
Het heeft er meer mee te maken dat lege ruimte tussen tags een textNode wordt in FF (correct) en wordt genegeerd door IE (verkeerd)
Bijvoorbeeld:
code:
1
2
3
<tag1>
  <tag2>hoi!</tag2>
</tag1>

In IE heeft tag1 1 child, nl tag2. In FF heeft het 3 childs. In FF zou de volgende code ook maar 1 child kennen:
code:
1
<tag1><tag2>hoi!</tag2></tag1>


In het volgende geval hebben zowel IE als FF 3 childs:
code:
1
2
3
4
5
<tag1>
  tekst
  <tag2>hoi!</tag2>
  tekst
</tag1>

Volgens mij zit het zo. Is wel een beetje offtopic, dus als ontopic reactie: probeer vanuit de standaarden te werken, ik zou het zo doen:
code:
1
var subject = thread.getElementsByTagName("subject")[0].firstChild.nodeValue;

  • RickyHeijnen
  • Registratie: Maart 2005
  • Laatst online: 30-04 09:02
Het werkt!! :D :D

Het lag helemaal niet aan het javascriptje... omdat ik geen .xml bestandje oproep, is de Content-type application/http.

Ik moest in mijn phpfile alleen even deze regel toevoegen:
PHP:
1
<? header('Content-type: application/xml'); ?>
Pagina: 1