Avatar billede fixxxer Nybegynder
14. oktober 2005 - 21:49 Der er 6 kommentarer og
1 løsning

xmlhttp og ie

jeg sidder og blev rød i hovedet over IE's elendige håndtering af XMLHttpRequest funktionaliteten..

Jeg har brugt guiden på http://www.xml.com/pub/a/2005/02/09/xml-http-request.html som insipiration.

Problemet er her:

response  = req.responseXML;
alert(response.documentElement);

IE returnere simpelhen null, hvorimod Firefox returnere [object Element] -- som den skal!

Hvad dælen gør jeg eller IE galt?



function loadXMLDoc(url)
{
    if (window.XMLHttpRequest)
    {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, false);
        req.send(null);
    }
    else if (window.ActiveXObject)
    {
        req = new ActiveXObject("Msxml2.XMLHTTP.3.0");
        if (req)
        {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, false);
            req.send(null);
        }
    }
}

function processReqChange()
{
    if (req.readyState == 4)
    {
        if (req.status == 200)
        {
            response  = req.responseXML;
            alert(response.documentElement);
        }
        else
        {
            alert("There was a problem retrieving the XML data:\n" + req.statusText);
        }
    }
}

loadXMLDoc('msg.php');



--msg.php--
<?
    header('Content-type: text/xml');
    echo '<?xml version="1.0" encoding="iso8859-1" standalone="yes"?>';
    echo '<response><name>Jonas</name><date>14:58:47</date><msg>hvordan g&aring;r det?</msg></response>';
?>
Avatar billede olebole Juniormester
14. oktober 2005 - 23:08 #1
<ole>

Det ville nu være rart, om FF håndterede XML ligeså korrekt, som IE, ikk'? Så ville du nemlig have opdaget, du ikke skriver XML. Prøv at kalde XML-dokumentet direkte i IE eller FF  ;o)

echo '<response><name>Jonas</name><date>14:58:47</date><msg><![CDATA[hvordan g&aring;r det?]]></msg></response>';

- og så bør du nok sætte charset'et korrekt ... det hedder: 'iso-8859-1'  :)

Derudover kalder du synkront, hvorfor det ikke giver mening at vente på readystateChange:

<script type="text/JavaScript">
function loadXMLDoc(url)
{
    if (window.XMLHttpRequest)
    {
        req = new XMLHttpRequest();
        req.open("GET", url, false);
        req.send(null);
    }
    else if (window.ActiveXObject)
    {
        req = new ActiveXObject("Msxml2.XMLHTTP.3.0");
        if (req)
        {
            req.open("GET", url, false);
            req.send(null);
        }
    }
    response  = req.responseXML;
    alert(response.documentElement);
}
</script>

/mvh
</bole>
Avatar billede fixxxer Nybegynder
15. oktober 2005 - 18:03 #2
Nogen gange er jeg bare for hurtig til at fare i flint over IE - generelt er den jo gal med den browser.

Jeg kan se at både IE og FF brokker sig over syntaxen i mit XML dokument, så de gør det vel egenlig rigtig nok begge to.. med lidt nærmere undersøgelse kan jeg også se at FF ikke lader mig kommer synderligt meget længere end til documentElement, så det er jo noget med det XML der gør vrøvl.

Nu har jeg i mellemtiden rettet mine fejl, nogen grimme nogen, men man lære af at rette sine fejl :)

Alligvel virker det ikke efter dine anvisninger:

    header('Content-type: text/xml');
    echo '<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>';
    echo '<response><name>Jonas</name><date>14:58:47</date><msg><![CDATA[test]]></msg></response>';

Det her er nu et XML spørgsmål og ikke længere et JavaScript spørgsmål.. men du skal også have tak for at påpege den synkrone tilstand som XMLHttp'en var sat op til - det havde jeg også overset :)
Avatar billede fixxxer Nybegynder
15. oktober 2005 - 18:05 #3
Sludder og vås... Det virker, IE skulle åbenbart lukkes og åbnes igen, før det virkede..
Avatar billede olebole Juniormester
15. oktober 2005 - 19:03 #4
Ja, pas på med XML-dokumenter, der bliver opdateret. Det vil en bruger normalt ikke opdage i IE - med mindre, han starter en ny browser-session. Det kan du klare på to måder:

function loadXMLDoc(url) {
  url = url + "?u=" + new Date().getTime();
... osv ...

- så tror browseren altid, det er et nyt XML-dokument, der kaldes og vil derfor altid hente det udenom cache'en.

En anden metode er at bruge no-cache headers i toppen af XML-dokumentet:
  http://dk2.php.net/manual/da/function.header.php

Det vil absolut være at foretrække, da de også virker, hvis XML'en skal bruges i andre sammenhænge  :)
Avatar billede fixxxer Nybegynder
15. oktober 2005 - 19:09 #5
Jeg valgte at bruge no-cache metoden.. Mange tak for din hjælp!
Avatar billede olebole Juniormester
15. oktober 2005 - 19:17 #6
- selvtak ... men husk også det andet, lille 'hack'. Det kan bruges i andre sammenhænge, hvor man ikke lige kan komme til at sætte HTTP-headers  ;o)
- og tak for points  :)
Avatar billede fixxxer Nybegynder
17. oktober 2005 - 00:01 #7
Jeg har oprettet et spørgsmål i forlængelse af dette.. Din hjælp vil være yderst velkommen :)

http://www.eksperten.dk/spm/656612
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