IE kent geen responseXML.getElementById

Pagina: 1
Acties:

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
Met de volgende code doe ik een xmlHttpRequest;

JavaScript:
1
2
3
4
5
6
7
function validateNickname(ev, ob)
{
    var x = getObj(ev, ob);
    nicknamereq = null;
    var request = '<data><action>custom</action><template>validate_nickname</template><nickname>'+x.value+'</nickname></data>';
    nicknamereq = xmlreq(board_script_url + '/../xml_input/', request, '_validateNickname');
};
De _validateNickname functie:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function _validateNickname()
{
    if(typeof nicknamereq != 'undefined' && nicknamereq != null && nicknamereq.readyState == 4 )
    {
        var res = nicknamereq.responseXML.getElementById('result').firstChild.nodeValue;

        if(res && res == '1')
        {
            alertUser(document.getElementById('nickname'), 'Deze gebruikersnaam is al in gebruik');
        }

        nicknamereq = null;
    }
};
Het probleem is dat IE6 de nicknamereq.responseXML.getElementById helemaal niet vindt. nicknamereq.responseXML.nodeType is 9, de HTML is valid en in FireFox werkt het wel.

Heeft iemand enig idee wat hier misgaat? De HTML die geretourneerd wordt is:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<head>
<title>Custom</title>
<base href="http://www.office.parse.nl/~michiel/forum/react/board/www/forum/" />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
</head>
<body class="custom">
<div id="core">
<span id="result">1</span>
<p>Deze actie is niet voor gebruik door gebruikers</p>
</div>
</body>
</html>

[ Voor 3% gewijzigd door chem op 16-08-2005 12:27 . Reden: newlines @ html ]

Klaar voor een nieuwe uitdaging.


Verwijderd

wilde gok:
moet je niet responseXML.documentElement.getElementById() hebben?

2nd thought: is getElementById() eigenlijk wel een method van het xml document object?

[ Voor 37% gewijzigd door Verwijderd op 16-08-2005 13:00 ]


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
.documentElement is ook undefined...

Klaar voor een nieuwe uitdaging.


  • Sappie
  • Registratie: September 2000
  • Laatst online: 21-04 17:17

Sappie

De Parasitaire Capaciteit!

documentElement should do it zou ik ook zeggen.

Ik neem aan dat de _validateNickname functie aangeroepen wordt op het moment dat het onreadystatechange event van de XMLHttpRequest getriggerd wordt.. je zou dan ook nog even de status van de XMLHttpRequest moeten checken.. (nicknamereq.status == 200).. denk niet dat dat iets oplost, maar tis sowieso beter / netter.

Verder cached IE de zooi die je opvraagt met behulp van een XMLHttpRequest nogal vaag. Misschien heb je de HTML die je opvraagt nog recent gewijzigd en IE niet opnieuw opgestart / hard gerefreshed?

edit: heb het even getest.. maar het lijkt erop dat wat mophor in 2e instantie zegt wel eens zou kunnen kloppen

[ Voor 10% gewijzigd door Sappie op 16-08-2005 13:14 ]

Specs | Audioscrobbler


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 09:14

Pelle

🚴‍♂️

Zowiezo altijd pas XML gaan parsen als het ingeladen is (in FF kun je volstaan met onload, in IE moet je eerst nog een trigger zetten op de onreadystatechange, en daarna de readystate uitlezen (die moet 4 zijn)).
Vervolgens moet je met responseXML.getElementsByTagName alles kunnen benaderen wat je wilt :)

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
Sorry, .documentElement is niet undefined, maar "leeg".

De status is 200, en ...
typeof nicknamereq.responseXML.documentElement = object
typeof nicknamereq.responseXML.getElementsByTagName= unknown
nicknamereq.responseXML.documentElement.getElementById = undefined

Zover ik weet is responseXML gewoon een geldige DOM-node (iig type 9, gelijk aan een gewoon document); maar wil het maar niet lukken.



Pelle; getElementsByTagName werkt wel, maar ik wil byId doen :)
Bij tagName moet ik wel hele specifieke tags etc gaan gebruiken; is er geen manier om byId wel te laten werken?

Verder doe ik al een nicknamereq.readyState == 4 zoals je ziet :)

[ Voor 32% gewijzigd door chem op 16-08-2005 13:34 ]

Klaar voor een nieuwe uitdaging.


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
jaja, kicken mag niet :P

Maar ik doe het stiekem toch even, niemand een idee waarom .getElementById niet bestaat? Terwijl het wel een DOM nodeType 9 is?

Klaar voor een nieuwe uitdaging.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
.getElementById staat niet op de kaart:

http://msdn.microsoft.com...l/wce50lrfdomdocument.asp

Dus het lijkt er inderdaad op dat je Tagname moet gebruiken als je IE wilt ondersteunen.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

chem schreef op woensdag 17 augustus 2005 @ 09:47:
jaja, kicken mag niet :P

Maar ik doe het stiekem toch even, niemand een idee waarom .getElementById niet bestaat? Terwijl het wel een DOM nodeType 9 is?
Waarom... Is brakke implementatie geen goede omschrijving :? :P

offtopic:
of gewoon laat :(

[ Voor 5% gewijzigd door BtM909 op 17-08-2005 10:07 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
P_de_B schreef op woensdag 17 augustus 2005 @ 09:57:
.getElementById staat niet op de kaart:

http://msdn.microsoft.com...l/wce50lrfdomdocument.asp

Dus het lijkt er inderdaad op dat je Tagname moet gebruiken als je IE wilt ondersteunen.
Ik zocht me al de &#@$ op MSDN, ook deze lijst is voor Windows CE clients; maar het zal wel identiek zijn.

Wat een klote-zooi, wordt dus weer lekker aanklooien met proprietary code voor alle browsers.

Tnx, anyways :)

Klaar voor een nieuwe uitdaging.


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

FireFox wil er trouwens ook niet aan :?
Testje: http://dev.barad-dur.nl/xmlhttp/

Nu met Land Rover Series 3 en Defender 90


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
chem schreef op woensdag 17 augustus 2005 @ 10:08:
[...]

Ik zocht me al de &#@$ op MSDN, ook deze lijst is voor Windows CE clients; maar het zal wel identiek zijn.

Wat een klote-zooi, wordt dus weer lekker aanklooien met proprietary code voor alle browsers.

Tnx, anyways :)
Ah inderdaad verkeerde linkje : XML DOM referentie. Nu wel de goede, en nog steeds geen getElementById.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • gekkie
  • Registratie: April 2000
  • Laatst online: 21-04 19:52
P_de_B schreef op woensdag 17 augustus 2005 @ 10:14:
[...]


Ah inderdaad verkeerde linkje : XML DOM referentie. Nu wel de goede, en nog steeds geen getElementById.
Ik zie daar ook geen "id" property eigenlijk ...

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
Maar jij wacht ook niet op .readyState == 4, goede kans dat je dan nog met een niet-compleet document zit.

Ik ben nu aan het kijken naar .selectSingleNode in IE, waar ik met een XSL Pattern mogelijk het juiste element kan krijgen; al wil .selectSingleNode('span[@id="result"]'); nog niet echt.


Met de volgende code werkt het wel, en aanzienlijk betrouwbaarder dan met firstChild etc.:

JavaScript:
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
function _validateNickname()
{
    if(typeof nicknamereq != 'undefined' && nicknamereq != null && nicknamereq.readyState == 4 )
    {
        if(nicknamereq.responseXML.getElementById)
        {
            var res = nicknamereq.responseXML.getElementById('result').firstChild.nodeValue;
        }
        else if(typeof nicknamereq.responseXML.selectSingleNode != 'undefined')
        {
            var res = nicknamereq.responseXML.selectSingleNode('//span[@id="result"]').text;
        }
        else
        {
            var res = nicknamereq.responseXML.getElementsByTagName('span')[0].firstChild.nodeValue;
        }

        if(res && res == '1')
        {
            alertUser(document.getElementById('nickname'), 'Deze gebruikersnaam is al in gebruik');
        }

        nicknamereq = null;
    }
};

[ Voor 46% gewijzigd door chem op 17-08-2005 10:30 ]

Klaar voor een nieuwe uitdaging.


Verwijderd

Waarom gebruik je geen XPath? :)

edit:

te laat

[ Voor 32% gewijzigd door Verwijderd op 17-08-2005 10:36 ]


Verwijderd

gekkie schreef op woensdag 17 augustus 2005 @ 10:21:
Ik zie daar ook geen "id" property eigenlijk ...
Dat klopt, voor zover ik weet kun je wel aangeven in je XML schema of DTD of een bepaald attribuut als uniek ID kan worden gekenmerkt. Maar id is zeker niet automatisch een identifier.

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

chem schreef op woensdag 17 augustus 2005 @ 10:26:
Maar jij wacht ook niet op .readyState == 4, goede kans dat je dan nog met een niet-compleet document zit.
Jawel hoor maar die zie je hier niet :)
Hier wel: http://dev.barad-dur.nl/xmlhttp/xmlhttp.js

Nu met Land Rover Series 3 en Defender 90


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
Ik blijf maar tegen problemen lopen bij IE en XML.

Het model dat andere browsers hanteren is dermate eenvoudiger en consistenter, dat ik me afvraag hoe ik dit onder IE aan de praat ga krijgen.

Concept
Een JS call haalt een (x)HTML pagina op via xmlHttpRequest. Een callback zoekt naar een table id="calendar" en bewaart deze. vv. maakt deze callback een div aan, append hier de table aan, en append de div aan de document.body.

Probleem 1: getElementsById
Bij IE wil het vinden van de table maar met moeite. Waar Gecko en tzt Safari gewoon met req.responseXML.getElementById() aan de slag kunnen, wil IE dit niet. Dus, splitten we de code al:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var div = document.createElement('div');
div.id = "calendar-wrapper";

if(calendarreq.responseXML.getElementById)
{
    var calendar = calendarreq.responseXML.getElementById('calendar');
    calendar.id = '';

    div.appendChild(calendar);
}
else
{
    var calendar = calendarreq.responseXML.documentElement.childNodes[1].getElementsByTagName('table')[0];
    cloneNodeDeep(calendar, div);
}

document.body.appendChild(div);
Dit is behoorlijke kazig; een fixed documentstructuur verplichten. Tevens doet de cloneNodeDeep een +=innerHTML ipv een echte DOM instructie.
Mogelijk zou het iets fraaier kunnen door alle tables te doorlopen en vv naar de id/className/whatever te kijken.

Probleem 2: .xml != DOM node
Het volgende punt is het ophalen van de huidige dag. Hiervoor hergebruik ik wederom al bestaande acties en templates; de dagweergave is echter gevuld met lege rows die bij een mini-weergave dermate veel vervuiling geven dat ik alleen de echte events eruit wil halen.
JavaScript:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
function displaySelectedDay()
{
    if(typeof calendardayreq != 'undefined' && calendardayreq != null && calendardayreq.readyState == 4 )
    {
        if(calendardayreq.responseXML.getElementById)
        {
            var calendar = calendardayreq.responseXML.getElementById('calendar');
            calendar.id = '';
        }
        else
        {
            var calendar = calendardayreq.responseXML.documentElement.childNodes[1].getElementsByTagName('dl')[1];
            calendar = calendar.xml;
        }

        var div = document.getElementById('calendar-today');
        if(!div)
        {
            div = document.createElement('div');
            div.id = 'calendar-today';
            document.body.appendChild(div);
        }
        else if(div.firstChild)
        {
            div.removeChild(div.firstChild);
        }

        if(calendar)
        {
            //post-process the tables .event
            var tableCells = cssQuery('td.event',calendar);

            if(tableCells.length > 0)
            {
                var clone = null;
                var newTable = document.createElement('table');
                var newTbody = document.createElement('tbody');
                newTable.appendChild(newTbody);
                var tableRow = null;
                for(var i=0;i<tableCells.length;i++)
                {
                    clone = tableCells[i].cloneNode(true);
                    clone.rowSpan = 1;
                    clone.colSpan = 1;

                    tableRow = document.createElement('tr');

                    tableRow.appendChild(clone);

                    newTbody.appendChild(tableRow);
                }
                var table = cssQuery('table.react-calendar',calendar)[0];
                table.parentNode.appendChild(newTable);
                table.parentNode.removeChild(table);
            }

            div.appendChild(calendar);
        }

        calendardayreq = null;
    }
};
(excuus voor de lap code).

Hier vinden talloze problemen plaats; allemaal terug te vinden zover ik weet in het soort object dat req.responseXML.documentElement.childNodes[1].getElementsByTagName('dl')[1].xml terug geeft: een XML object en geen DOM object. Deze kent een totaal andere interface dan de DOM en maakt het kopieeren en manipuleren moeilijk tot onmogelijk.

Ik moet dus op 1 of andere wijze aan de slag kunnen gaan met de .xml die IE teruggeeft; maar behalve een flinke XSLT die het object 1:1 overzet naar een DOM object (en dus dubbele code vereist: templates en een identieke XSLT) kan ik niks bedenken.

Wie heeft er ervaring met het werken met xmlHttpRequest, IE en het gebruikmaken van de DOM? Alle voorbeelden die ik vind werken met responseText en innerHTML - en het zou toch veel fraaier en degelijker moeten kunnen?

Klaar voor een nieuwe uitdaging.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Het returntype is volgens deze link een IXMLDomdocument.

Verder heb ik helaas weinig ervaring met het werken hiermee, dus daar kan ik je niet echt mee helpen.

[ Voor 13% gewijzigd door P_de_B op 22-08-2005 12:03 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20-04 14:54

chem

Reist de wereld rond

Topicstarter
P_de_B schreef op maandag 22 augustus 2005 @ 12:03:
Het returntype is volgens deze link een IXMLDomdocument.

Verder heb ik helaas weinig ervaring met het werken hiermee, dus daar kan ik je niet echt mee helpen.
Daar heb ik idd naar gekeken en vond daar onder andere transformNode dat met XSLT aan de slag kan.

Verdomd interessant, maar totaal niet wat ik wil doen... Gecko en Safari kunnen ook met XSLT aan de slag; maar ik had het wat anders in gedachten.

Klaar voor een nieuwe uitdaging.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Even een kick, want ik heb hier net 2 uur aangezeten en ben wel tot een oplossing gekomen. Ik maak dan geen gebruik van responseXML, maar gewoon van responseText die ik parse, waarvan ik dan het documentElement gebruik. De code die ik nu gebruik is dit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
if ( NAVIGATOR_IS_IE )
{
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(request.responseText);
    return xmlDoc.documentElement;
}
else
{
    return request.responseXML.documentElement;
}

Het is volgens mij niet de snelste methode, maar werkt dus wel. Met responseXML kwam ik nergens in IE (ik heb dus nu een nog grotere afkeer gekregen voor deze browser, als dat al mogelijk was :P).

Hopelijk helpt dit iemand of heeft iemand commentaar over hoe ik dit beter kan oplossen.

Noushka's Magnificent Dream | Unity

Pagina: 1