Avatar billede razmuzdk Nybegynder
15. oktober 2005 - 17:39 Der er 29 kommentarer

Firefox giver fejl - IE gør ikke (i simpelt "ajax-script")

Hej eksperter,

Jeg sidder og er for sjov ved at opbygge en meget simpel side via "ajax-princippet". Siden kan ses på razmuz.dk/vol5.

Min js-fil kan ses her: http://razmuz.dk/vol5/inc/jscript.js

I denne linje:

if(response.getElementsByTagName("title")[0]) {

... hvor jeg tjekker om <title>-tag'et findes i xml-filen (som fx kunne se sådan ud http://razmuz.dk/vol5/rpc.php?action=start), laver Firefox fejl: "response has no properties". Den virker fint i IE.

Hvad bør/skal jeg skrive hvis jeg vil tjekke om <title>-tag'et findes i xml-filen (response) således at det virker i begge browsere? Det må da kunne gøres uden at lave et browsertjek.

Herudover modtager jeg meget gerne generelle kommentarer til min brug af "AJAX". Jeg er helt ny i det, og vil derfor gerne lære hvordan "man normalt gør" :)

På forhånd tak,

Rasmus
Avatar billede olebole Juniormester
15. oktober 2005 - 18:51 #1
<ole>

Husker du at sætte den korrekte MIME?
  Header("Content-Type: text/javascript");

Der er ikke nogen korrekt måde at bruge 'Ajax' på - da der ikke findes en standardiseret teknologi, der hedder sådan. 'Ajax' er blot et ord, der er klistret på en samling af bestående teknologier, der ofte bruges sammen.
Selv har jeg således brugt 'Ajax' siden slutningen af 1999 ... længe før, der var noget, man kaldte 'Ajax'

/mvh
</bole>
Avatar billede olebole Juniormester
15. oktober 2005 - 18:55 #2
I øvrigt er dit XML-dokument ekstremt længe om at blive genereret. Noget kunne tyde på, det enten ligger på en meget langsom/overbelastet server - eller at du bruger et dårligt performende XML-lag  :)
Avatar billede razmuzdk Nybegynder
15. oktober 2005 - 19:03 #3
Tak for svaret. Jeps jeg var godt klar over det du siger med Ajax, men jeg tænkte bare, at der var nogle metoder der var mere roste/kritiserede end andre.

Hvor er det lige du ønsker at jeg sætter MIME-typen? I min jscript.js? - Mener du at jeg skal omdæbe den til jscript.php og sætter
<?php
Header("Content-Type: text/javascript");
?>
i toppen af filen? :)

Og hensyn til min xml-fil - jeg tror bare det er fordi den ligger på en over-crowded b-one-server *tsk* må hellere se at få den flyttet.

Hvad mener du med "XML-lag"? :)

Jeg "danner" min XML således i min rpc.php (igen - det er helt "hjemmeskrevet" og jeg aner overhovedet ikke om det er gjort på den mest hensigtsmæssige måde) således:
<?php
function scan_array($data) {
    global $level, $output;
    foreach($data as $key => $value) {
        for($i=0; $level>$i; $i++) $output .= "    ";
        $output .= "<".$key.">";
        if(is_array($value)) {
            $output .= "\n";
            $level++;
            scan_array($value);
            $level--;
            for($i=0; $level>$i; $i++) $output .= "    ";
        } else {
            $output .= $value;
        }
        $output .= "</".$key.">\n";
    }
}

function createXml($data) {
    global $output;
    header("Content-Type: application/xml; charset=ISO-8859-1");
    header("Pragma: no-cache");
    $output .= "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
    if($data) scan_array($data);
    print $output;
}
if($_GET['action'] == "start") {
    $array['doc']['title'] = "Velkommen";
    $array['doc']['text'] = "BLAH";
    createXml($array);
}
[...]
?>
Avatar billede olebole Juniormester
15. oktober 2005 - 19:33 #4
Ja, du skal sætte header'en helt øverst ... lige efter '<?php', så du er sikker på, du ikke har output'et noget før header'en bliver sat.

Der er noget indbygget XML-håndtering i PHP, du kan bruge, hvilket uden tvivl er hurtigere. Når jeg selv laver 'Ajax'-agtige applikationer bruger jeg næsten aldrig XML - men ren JS, som jeg finder en hel del hurtigere - og mindre CPU-, RAM- og trafik-krævende.
Metoden holder jeg dog ret tæt til kroppen ... man skal jo også leve  ;o)
Avatar billede razmuz_dk Nybegynder
15. oktober 2005 - 19:46 #5
Hehe jeps okay - jeg brugte også "ren js" før jeg skiftede til det nuværende - men jeg tænkte at det ville være lidt sejt, at alle ens sider findes i "rigtig xml" sådan at de kan bruges af andre applikationer.

... men jeg VED du også kender svaret på mit oprindelige spørgsmål, så hvad skal jeg rette denne linje til

if(response.getElementsByTagName("title")[0]) {

jævnfør forklaringen i toppen... tak! :)

Lige et tillægsspørgsmål: hvorfor er det nødvendigt at deklarere MIME-typen når den nu hedder *.js? :) Det ser da ud til at virke alligevel? :)
Avatar billede olebole Juniormester
15. oktober 2005 - 19:54 #6
Jamen, den hedder da ikke .js - den hedder jo: 'http://razmuz.dk/vol5/rpc.php'. Din XML-fil er en .php-fil ... derfor skal du sætte MIME  ;o)
Prøv nu lige at forklare browseren, det er en XML-fil, der er tale om ... så virker det sikkert også i FF  ;o)
Avatar billede olebole Juniormester
15. oktober 2005 - 19:56 #7
Dooohhhhh .... OleBole Bum ... ihhhhh, hvor er du bare .... daDum-daDum-daDej  :)

Du skal naturligvis sætte denne header:
  Header("Content-Type: text/xml");  ;D
Avatar billede olebole Juniormester
15. oktober 2005 - 19:58 #8
- og den skal naturligvis sættes øverst i 'http://razmuz.dk/vol5/rpc.php'  ;o)

- undskylder forvirringen mange gange  :)
Avatar billede razmuz_dk Nybegynder
15. oktober 2005 - 20:37 #9
Hehe okay - syntes nok det lød lidt underligt :)

Du er tilgivet hvis du lige svarer på 15/10-2005 19:46:56 :P
Avatar billede olebole Juniormester
15. oktober 2005 - 20:45 #10
Det vil jeg mene, jeg allerede har gjort. Betyder det, at det stadig ikke fungerer i FF, når den korrekte MIME er sat?
Avatar billede olebole Juniormester
15. oktober 2005 - 20:47 #11
Prøv evt. at alert'e:
  alert(response.documentElement);

- og:
  alert(response.documentElement.childNodes.length);

Hvad returnerer de to?
Avatar billede razmuz_dk Nybegynder
15. oktober 2005 - 20:51 #12
Nej det virker stadig ikke. Den kan slet ikke alert'e dem. Firefox siger:
Error: response has no properties
Source File: http://razmuz.dk/vol5/inc/jscript.js
Line: 30
Avatar billede olebole Juniormester
15. oktober 2005 - 21:12 #13
Du tester vel forhåbentlig under samme domæne, som XML-filen ligger under? Det virker ikke i FF, hvis f.eks. testfilen ligger lokalt - og XML-filen på en server.

Der er mange grunde til, jeg ikke bruger XML til Ajax-applikationer  ;o)
Avatar billede razmuz_dk Nybegynder
15. oktober 2005 - 21:16 #14
Det kører under samme domæne. Du kan se det hele på razmuz.dk/vol5 ...
Avatar billede olebole Juniormester
15. oktober 2005 - 21:19 #15
Hos mig siger FF, at der er et root-element - og at det har 5 childnodes  :)
Luk FF og start en ny browser-session. Det kan være FF har cached dokumentet
Avatar billede olebole Juniormester
15. oktober 2005 - 21:22 #16
PS: At FF siger fem childnodes og IE kun siger tre, skyldes at FF helt korrekt også tæller white-space noder med  ;o)
Avatar billede olebole Juniormester
15. oktober 2005 - 21:23 #17
- selv min gamle Mozilla 1.5 æder scriptet råt fra din side  :)
Avatar billede razmuzdk Nybegynder
15. oktober 2005 - 23:24 #18
Kører den også uden fejl når du trykker på Kontakt-knappen? (på razmuz.dk/vol5)

Det er først når man trykker på "Kontakt" den melder fejl...
Avatar billede olebole Juniormester
15. oktober 2005 - 23:36 #19
Prøv lige at kalde:
  http://razmuz.dk/vol5/rpc.php?action=kontakt
- direkte i en browser ... *host-host*
Avatar billede razmuz_dk Nybegynder
16. oktober 2005 - 00:16 #20
Jaja det ved jeg godt! - og det er derfor jeg laver "tjekket" i min js-fil. Hvis ikke <title> findes i response så skal den køre changePage('error'); - altså den skal vise en fejl side FORDI http://razmuz.dk/vol5/rpc.php?action=kontakt er "ikke gyldig" (den er tom).

if(response.getElementsByTagName("title")[0]) {
    // vis side
} else {
    changePage("error");
}

Hehe, er det til at forstå hvad jeg vil? ;)
Avatar billede olebole Juniormester
16. oktober 2005 - 01:07 #21
Jamen, den fejler naturligvis, fordi 'arrayet' response.getElementsByTagName("title") længde er 0  ;o)

Hvis der er fare for at loade et tomt dokument, kunne du spørge med:
  if (response.getElementsByTagName("title").length>0) alert("der er en titel")
  else alert("der er ikke en titel")

Du kan også prøve at spørge på status-property'en - prøv f.eks:

function handleResponse() {
    alert(http.status)
  ...osv ... osv ...
Avatar billede razmuz_dk Nybegynder
16. oktober 2005 - 01:32 #23
Jeg kender godt status-proberty'en - men den kan jo ikke bruges til at tjekke om title findes.

Jeg har nu rettet linjen til:
if(response.getElementsByTagName("title").length>0) {

Den melder stadig fejl i den linje i firefox,
Error: response has no properties
Source File: http://razmuz.dk/vol5/inc/jscript.js
Line: 30

(Jeg har slettet cache)

Gider du prøve tjekke om den også gør det ved dig på razmuz.dk/vol5 og om jeg har skrevet det korrekt? Mange tak.
Avatar billede olebole Juniormester
16. oktober 2005 - 01:56 #24
Det er jo fordi, du giver den et helt tomt 'XML-dokument' - og sætter du overhovedet XML-header'en? Det virker ikke sådan - og så skal det jo gå galt  :)

Din server er formodentlig sat op til at serve alle PHP-dokumenter med MIME: 'text/html'. Derfor nytter det ikke noget at pakke headren ind i en betingelse. Den skal _altid_ sættes. Ellers er der ingen klienter, der genkender dokumentet som et XML-dok.

Desuden består et validt XML-dokument altid af mindst en prolog og et dokument-, eller root-element  :)
Avatar billede razmuz_dk Nybegynder
16. oktober 2005 - 02:48 #25
Ja tænkte nok det var grunden - har sat headeren i toppen af filen og det virker :)

Men... jeg vil alligevel lige spørge: Kan man ikke tjekke om response ER en "ok xml-fil" så? Og så derefter tjekke om title eksisterer... :)
Avatar billede olebole Juniormester
17. oktober 2005 - 01:15 #26
Prøv med:
  if ( response && respons.documentElement ) { // Det ligner til forveksling et XML-dok  :)
Avatar billede roenving Novice
17. oktober 2005 - 03:49 #27
Nok:

if ( response && response.documentElement )
Avatar billede razmuz_dk Nybegynder
17. oktober 2005 - 13:10 #28
Tak ska du... og også lidt tak for din geniale indskydelse roenving! :P

Smid et svar olebole - du har været til meget stor hjælp.

PS: Kunne man ik' få lov til at se nogle af dine sider eller noget af din kode? :)
Avatar billede stig-b Nybegynder
13. december 2005 - 00:53 #29
Hvis du gerne vil se nogle kodeeksempler, prøv dette link:

http://24ways.org/advent/easy-ajax-with-prototype

stig-b
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