06. maj 2006 - 02:01Der 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
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
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)
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)
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 :)
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.
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 ;-)
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.
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 ;)
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 :)
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 ;-)
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" - 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)
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.
<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>
Synes godt om
Ny brugerNybegynder
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.