Avatar billede w13 Novice
25. maj 2007 - 20:12 Der er 18 kommentarer og
2 løsninger

appendChild fungerer ikke

Hej Eksperter.

Hvordan kan det være, at følgende kode ikke har effekt:
-------------------------------------
alert('1');
newModul = document.createElement("img");
newModul.setAttribute("title","fed");
newModul.setAttribute("src","components/bold/images/bold_dk.gif");
newModul.setAttribute("onclick","ExecCommand('Bold',false);");
newModul.setAttribute("onmouseover","this.style.backgroundImage='url(skins/windows/hover.gif)';");
newModul.setAttribute("onmouseout","this.style.backgroundImage='';");
document.getElementById("tools").appendChild(newModul);
alert('2');
-----------------------------------
De 2 alerts er en lille test. Den første vises, det gør den anden ikke.. Og den virker først, når jeg fjerner "document.getElementById("tools").appendChild(newModul);". Og af en eller anden grund også, når jeg retter denne til: "document.getElementsByTagName("head")[0].appendChild(newModul);"

Hvorfor dog?
Avatar billede crazysnap Seniormester
26. maj 2007 - 16:18 #1
Hej w13,

Det tyder meget på at du ikke har et element på siden med id="tools". Prøv at indsætte f.eks:

<div id="tools"></div>

på din side et sted. Det SKAL virke... :)


Mvh.

- Snap :)
Avatar billede w13 Novice
26. maj 2007 - 18:03 #2
Det div-element er der skam.. men kan det have noget at gøre med, at jeg inkluderer javascript-koden i min header?
Avatar billede erikjacobsen Ekspert
26. maj 2007 - 18:04 #3
Din  <div id="tools"></div>  skal eksistere på det tidspunkt hvor din javascript udføres.
Avatar billede w13 Novice
26. maj 2007 - 18:07 #4
scheisse.. ja, ikke engang:
alert('1');
alert(document.getElementById("tools").id);
alert('2');
virker.. den stopper efter 1eren.. hmm, kigger lige lidt på det..
Avatar billede erikjacobsen Ekspert
26. maj 2007 - 18:09 #5
Du kan een af 2
1) Anbringe dit JS efter <div id="tools"></div>
2) Udføre det i en <body onload="...">
Avatar billede w13 Novice
26. maj 2007 - 18:18 #6
Jaeh, problemet er sådan set bare følgende:

Jeg laver en texteditor i JavaScript og ville gerne inkludere moduler fra en mappe kaldet "components" så automatisk som muligt. Det spurgte jeg så om her på Eksperten og fik følgende kode:
---------------------------
var moduls = Array("bold","italic","underline");

for (i=0;moduls.length>i;i++) {
  newModul = document.createElement("script");
  newModul.setAttribute("type","text/javascript");
  newModul.setAttribute("src","components/" + moduls[i] + "/" + moduls[i] + ".js");
  document.getElementsByTagName("head")[0].appendChild(newModul);
}
---------------------------
Men jeg synes ikke det virker, når jeg retter til andet end "getElementsByTagName("head")[0]".. :(

I hvert fald inkluderer denne kode fint til header.. Men jeg kan jo så ikke rigtig lægge alle disse inkluderede i en funktion, vel?
Avatar billede w13 Novice
26. maj 2007 - 18:20 #7
Doh.. Hvis jeg nu bare kører denne inkluderingskode til sidst i koden og ikke lige efter head'er.. :P Så kunne det jo være, den kendte andre elementer end head.. prøver lige :)
Avatar billede w13 Novice
26. maj 2007 - 18:24 #8
Ja, nu har jeg så fået den ind i "tools", men den ene ting er, at koden ikke længere er ligeglad, hvis moduler ikke findes (den brokker sig ret meget), og hverken onclick, onmouseover, eller onmouseout reagerer.. :S
Avatar billede erikjacobsen Ekspert
26. maj 2007 - 18:43 #9
Ja, tænk engang: elementer skal findes før de kan bruges. Du får vel nogle fejl - og så kan du tage dem derfra. getElementById aflevere en null, hvis elementet ikke findes.
Avatar billede roenving Novice
26. maj 2007 - 22:54 #10
Oversat til mit sprog: Vis os en kode, hvor din fejl forekommer ...
Avatar billede crazysnap Seniormester
26. maj 2007 - 22:59 #11
Hej igen,

Hvad events'ne angår så prøv med:


newModul.onclick = function() { ExecCommand('Bold',false); };
newModul.onmouseover = function() { this.style.backgroundImage="url('skins/windows/hover.gif')"; };
newModul.onmouseout = function() { this.style.backgroundImage=""; };


Det burde ihvertfald virke. :)


Mvh.

- Snap :)
Avatar billede roenving Novice
26. maj 2007 - 23:10 #12
Hov, det overså jeg da fuldstændigt ...

-- forhåbentlig har du valgt en grundlæggende doctype, der understøtter 'den skøre snappers' måde at lave event-tildelinger på, men ellers er det jo ikke muligt at komme uden om egentlige 'xml-agtige' tildelinger med addEventListener/attachEvent-ting !-)
Avatar billede w13 Novice
27. maj 2007 - 01:34 #13
Hold da kæft.. :P Det løste det hele!
I må lige oprette svar alle 3!
Avatar billede erikjacobsen Ekspert
27. maj 2007 - 01:36 #14
Ingen point til mig, tak.
Avatar billede crazysnap Seniormester
27. maj 2007 - 15:45 #15
Det lyder godt, og der kommer et svar herfra! :)


Mvh.

- Snap :)
Avatar billede w13 Novice
28. maj 2007 - 01:22 #16
Roen? :)
Avatar billede roenving Novice
28. maj 2007 - 08:50 #17
Velbekomme '-)

-- tog mig lige en dag uden Eksperten (læste så resten af Ringenes Herre i stedet !-)
Avatar billede roenving Novice
28. maj 2007 - 14:01 #18
-- og tak for point ;~}
Avatar billede crazysnap Seniormester
28. maj 2007 - 22:53 #19
Indeed, tak for point og glad for at høre du fik det til at virke! :)


Mvh.

- Snap :)
Avatar billede olebole Juniormester
30. maj 2007 - 13:49 #20
<ole>

'addEventListener/attachEvent-tingen' er nu ikke spor XML-agtig. De seneste små 10 år har det været den måde, vi bør bruge event-listeners på. addEventListener hører til i DOM Level 1.

Hvis vi - som tilfældet burde være - fik en DOM-node returneret med document.getElementById, er det tilmed den eneste måde, vi kan sætte en listener på.

I stedet får vi returneret en 'hDtOmMl-eNlOeDmEent' ... en bastard mellem et HTML-element objekt og en DOM-node. Dét er årsagen til, at eksemplerne i (26/05-2007 22:59:10) på trods af standarderne stadig virker  =)

/mvh
</bole>
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