Avatar billede ttopholm Nybegynder
06. maj 2006 - 02:01 Der er 28 kommentarer og
1 løsning

Global variabel bliver ikke sat i funktion

Jeg har dette her:
var myMenu = new Array();

function fetchMenu() {
    http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

    if (!http_request) {
        alert('Giver op :(, kan ikke oprette XMLHTTP');
        return false;
    }
    http_request.onreadystatechange = fillMenuItems;
    http_request.open('GET', '/php/menu.php', true);
    http_request.send(null);

}

function fillMenuItems() {
    if (http_request.readyState == 4) {
        if (http_request.status == 200) {
            var xmldoc = http_request.responseXML;
            var menuItems =  xmldoc.getElementsByTagName('menuItem').length;
            for (i=0;i<menuItems;i++)
            {
                myMenu[i] = xmldoc.getElementsByTagName('menuName').item(i).firstChild.data;
            }
        } else {
            alert('There was a problem with the request.');
        }
    }
}

fetchMenu();


Når jeg kalder fetchMenu er det meningen at den skal fylde mit myMenu-array op med data, det gør den også når jeg skriver det ud i funktionen fillMenuItems, men når jeg så udenfor funktionen prøver at kalde myMenu[0] giver den mig undefined, hvorfor det, da jeg jo har sat myMenu til global variabel
Avatar billede erikjacobsen Ekspert
06. maj 2006 - 02:11 #1
Du skriver ikke myMenu ud før den er hentet hjem?
Avatar billede olebole Juniormester
06. maj 2006 - 02:30 #2
<ole>

Hvis du har alert'et et eller flere elementer i array'et inde i funktionen, må du have overskrevet array'et et andet sted, når du tester udenfor funktionen - eller som Erik siger: Du prøver at alert'e, inden XML'en er nået 'hjem' til maskinen og funktionen 'fillMenuItems' er kørt

/mvh
</bole>
Avatar billede olebole Juniormester
06. maj 2006 - 02:32 #3
Prøv at skrive den alert, du tester med (og får 'undefined'), samtidig med denne:

function fillMenuItems() {
    if (http_request.readyState == 4) {
        if (http_request.status == 200) {
            var xmldoc = http_request.responseXML;
            var menuItems =  xmldoc.getElementsByTagName('menuItem').length;
            for (i=0;i<menuItems;i++)
            {
                myMenu[i] = xmldoc.getElementsByTagName('menuName').item(i).firstChild.data;
            }
            alert("I funktionen: " + myMenu[0])
        } else {
            alert('There was a problem with the request.');
        }
    }
}

- så kan du se, hvilken alert der afvikles først. Er det din egen, kalder du for tidligt  ;o)
Avatar billede ttopholm Nybegynder
06. maj 2006 - 03:00 #4
Ahh... Ja den udenfor bliver kaldt først... Men hvordan løser jeg den så... Fordi jeg har en funktion der skriver menuen ud sådan her:

function makeMenu()
{
    var i;
    var menu;
    for(x in myMenu)
    {
        if(x==0)
        {
            document.write('<td class="menu"><br><a href="#" id="' +
                          myMenu[x] + '" class="menu" onClick="change(this.id)">' +
                          myMenu[x] + '</a></td>');
        }else{
            document.write('<td class="menuspacer"><br>|</td><td class="menu"><br><a href="#" id="' +
                            myMenu[x] + '" class="menu" onClick="change(this.id)">' +
                            myMenu[x] + '</a></td>');
        }
    }
}

Som skal sættes ind ;-)
Avatar billede erikjacobsen Ekspert
06. maj 2006 - 03:02 #5
Nogen speciel grund til at bruge AJAX? Jeg kan godt slå søm i med en træsko, men den egner sig egentlig bedst til at have på foden.
Avatar billede ttopholm Nybegynder
06. maj 2006 - 03:07 #6
Det var for at lege lidt... Men det nemmeste er vel at bare bibeholde min menu statisk mens indholdet kan jeg lave dynamisk med ajax
Avatar billede olebole Juniormester
06. maj 2006 - 03:15 #7
Er det noget, du gerne vil have Google til at se? Så kræver det ofte fantasifulde krumspring, hvis du bruger AJAX.

Nu, da Erik har bragt sømmene på banen, kommer jeg i tanker om, min gamle underbo, som altid sagde:
  "For en mand med en ny hammer kommer alt til at ligne søm"  ;o)
Avatar billede olebole Juniormester
06. maj 2006 - 03:20 #8
For princippets skyld (og kun det) kunne du mare skrive:
    makeMenu();

- der, hvor jeg skrev alert'en. Så ville den funktion blive kaldt, så snart array'et er fyldt.

- men som sagt er AJAX nok ikke lige teknikken at bruge i den situation  :)
Avatar billede ttopholm Nybegynder
06. maj 2006 - 03:26 #9
Tror jeg læser menuen ind via dom fra starten også lader ajax styre mit indhold af tekst... ;-)

Hvis i vil have point så smid et svar...
Avatar billede erikjacobsen Ekspert
06. maj 2006 - 03:31 #10
Ingen point til mig, tak. Det er fint du har set lyset her i maj-nattens mørke.
Avatar billede erikjacobsen Ekspert
06. maj 2006 - 07:55 #11
Og Ole, så mener du nok ikke det første du skrev 03:20:16. Kig lige på det ved dagslys, og fortæl mig om det ikke er mørkemandssnak.
Avatar billede olebole Juniormester
07. maj 2006 - 17:10 #12
Erik >> du har helt ret! 'document.write' stod lidt langt fra gaslygten - men jeg ledte dér, da det var under den, der var mest lys  ;D

Da AJAX er fra dette årtusinde, bruger man ikke 'document.write', men indsætter i stedet elementer i sidens DOM ved hjælp af DOM-metoder ... ellers kan det ikke bruges til ret meget  :)
Avatar billede erikjacobsen Ekspert
07. maj 2006 - 17:13 #13
Eller set fra een, der plejer at klatre op i alle de gaslygter jeg ser på vejen: Når dokumentet er rendereret, dvs. når den sidste </html> er spist og fordøjet, hvad skal browseren så gøre med en document.write.
Avatar billede ttopholm Nybegynder
07. maj 2006 - 17:22 #14
Ja... Jeg ser lige på det, og ser om jeg ikke bare laver en div om hele siden med med visibility:hidden og så i fillmenuItems sætter den til visible, når alt er hentet igennem og sætter menuen ind med inner.html ;-)
Avatar billede ttopholm Nybegynder
07. maj 2006 - 17:25 #15
så kunne jeg jo lave en div i starten med loading.. eller rettere den har jeg allerede.. så det burde vil ikke være det store arbejde... ;-)
Avatar billede erikjacobsen Ekspert
07. maj 2006 - 17:27 #16
Nej, men hverken AJAX eller gaslygter egner sig synderligt til det. De har det tilfælles, at de først skal aktiveres når det er nødvendigt. Din side vil "blinke" inden menuen kommer.
Avatar billede ttopholm Nybegynder
07. maj 2006 - 17:33 #17
Også hvis jeg har et layer med noget i som vises indtil den har kørt fillItemsMenu, hvor menuen bliver sat.... burde den jo ikke blinke.
Avatar billede erikjacobsen Ekspert
07. maj 2006 - 17:36 #18
Ja, og man kan stå på Himmelbjerget og synge Internationale. Alt er muligt. Jeg mangler at se formålet med dit Ajax. Og heller ikke med den der på Himmelbjerget. Men ret beset har jeg ikke lyst til at blande mere i nogen af dem ;)
Avatar billede ttopholm Nybegynder
07. maj 2006 - 17:41 #19
Okay... Fair nok... Grunden er det skal være en dynamisk menu uden decideret serverside script...
Avatar billede erikjacobsen Ekspert
07. maj 2006 - 17:42 #20
Og man kan lave den første visning af menuen dynamisk uden at blande gammelt vaskepulver ind idet. Fy, Erik, så så, ikke blande dig...!
Avatar billede olebole Juniormester
07. maj 2006 - 18:38 #21
Erik >> (07/05-2006 17:13:55) - det var præcist, hvad jeg mente med kommentaren (07/05-2006 17:10:42)  ;o)

ttopholm >> Jeg forstår heller ikke, hvorfor du vil bruge AJAX. Det er - så vidt jeg kan se - helt uegnet til det, du prøver ... og så gemmer fremgangsmåden jo dine sider fabelagtig godt for Google  :)
Avatar billede ttopholm Nybegynder
07. maj 2006 - 18:43 #22
Det kan godt være det er uegnet, men nu var det jo engang det jeg ville, og har fået det til at virke, så hvis nogen af jer vil have point, så smid et svar, da i nu hjælp mig en del på vej ;-)
Avatar billede olebole Juniormester
07. maj 2006 - 18:49 #23
Ellers tak ... jeg tjener nødigt på dårlige løsninger  :)

1) det er ikke AJAX
2) havde der været tale om AJAX, ville det have været misforstået brug af teknikken
Avatar billede ttopholm Nybegynder
07. maj 2006 - 18:55 #24
Rigtigt.. Det er måske ikke den rigtige måde at bruge ajax på i dette sammenhæng... Men det er mere for at prøve det.. og menuen er en meget lille ting af det.. ;-)

Alt det andet kører nu AJAX
Avatar billede ttopholm Nybegynder
07. maj 2006 - 19:28 #25
Lukker så..
Avatar billede olebole Juniormester
07. maj 2006 - 21:35 #26
"Alt det andet kører nu AJAX" - for lige at præcisere:
Så er formaterer du altså ikke længere HTML'en på serveren, men på klienten - og indsætter HTML-elementerne med DOM ... ikke med 'document.write' eller 'innerHTML'  ;o)
Avatar billede ttopholm Nybegynder
07. maj 2006 - 21:50 #27
Ja den formatere det på klienten... Og i AJAX kan du jo bruge innerhtml, til at sætte tingene ind...
Avatar billede olebole Juniormester
07. maj 2006 - 23:58 #28
I princippet kan man gøre stort set, hvad man har lyst til, men der er ingen grund til at være bagudskuende, når man lærer nye teknikker. Hvis du bruger XML til at formatere dine data, kan du jo ligeså godt bruge DOM til at indsætte elementer med - for du læser vel alligevel XML'en ved hjælp af DOM-metoder.

innerHTML-property'en har aldrig nogensinde været valid 'det ene eller det andet' ... den har aldrig været en del af nogen standard. Heller ikke XHTML (eller XML-DOM'en, som jo skal bruges under XHTML) vil den blive en del af, når vi engang kan komme til at bruge XHTML på WWW.

MS indførte innerHTML engang i midten af 90'erne, før W3C barslede med den standardiserede DOM og der ikke var andre muligheder for at indsætte elementer, dynamisk.
W3C har derimod aldrig ønsket at standardisere innerHTML som en del af deres ECMA-DOM bindingerne, da den strider diamentralt mod DOM-tanken, hvor alt er noder/elementer ... ikke strenge.

Desuden overskriver du det element, du bruger innerHTML i - hvorved du sletter evt. dynamisk satte event-handlers, expando-properties, m.m. på objekter i det pågældende element.
Avatar billede olebole Juniormester
08. maj 2006 - 00:09 #29
Prøv f.eks. dette eksempel:

<script type="text/JavaScript">
function hippopotamus() {
    var o = document.getElementById("gnu");
    o.innerHTML = o.innerHTML + "<br><br>Hvofor ...? Fordi, jeg er blevet overskrevet og derfor ikke er helt mig selv, længere ;o)";
}

window.onload = function() {
    var o = document.getElementById("gnu");
    var oChild = o.getElementsByTagName("div")[0];
    oChild.onclick = function() {
        alert("Du klikkede på teksten");
    }
}
</script>

<button onclick="hippopotamus()">TEST</button>

<div id="gnu">
    <div>Klik først på denne tekst.<br>
        Klik derefter på knappen, der indsætter noget HTML i dette div's parent.<br>
        Klik til sidst igen på teksten her ... ØV! :o|</div>
</div>
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