Avatar billede w13 Novice
30. maj 2007 - 21:17 Der er 15 kommentarer og
1 løsning

Oprette en select-menu med options ved brug af appendChild

Hej Eksperter.

Jeg har følgende kode, som opretter et billede inde i et element med id="tools":
----------------------------------------------
newModul = document.createElement("img");
newModul.setAttribute("title","Fed");
newModul.setAttribute("src","components/bold/images/bold_dk.gif");
newModul.onclick = function() { ExecCommand('Bold',false); };
document.getElementById("tools").appendChild(newModul);
----------------------------------------------
Men hvordan shaitan opretter jeg en select-menu, dvs. en <select> med en del forskellge <option>-tags inden i?

Håber I kan hjælpe!
Avatar billede windcape Praktikant
31. maj 2007 - 00:35 #1
// laver select box
var selectBox = document.createElement('select');
// array med options objekter
var myOptions = [
    new Option(1,'foo'),
    new Option(2,'bar'),
    new Option(3,'bas')
];
// tilføjer dine options
for(i=0;i<myOptions.length;i++) {
    selectBox.options[selectBox.options.length] = myOptions[i];
}
selectBox.selectedIndex = 0; // sætter selected til første element
Avatar billede windcape Praktikant
31. maj 2007 - 00:37 #2
Avatar billede windcape Praktikant
31. maj 2007 - 00:39 #3
og en anden måde at gøre det på

    // Formatting selector
    var styleSelect = upperToolbar.appendChild(document.createElement('select'));
        styleSelect.className = 'style';
        styleSelect.onchange  = function() {
            rte.formatText('formatblock',styleSelect);
        }
    var idx = styleSelect.options.length;
        styleSelect.options[idx++] = new Option('[Style]','');
        styleSelect.options[idx++] = new Option('Paragraph <p>','p');
        styleSelect.options[idx++] = new Option('Heading 1 <h1>','h1');
        styleSelect.options[idx++] = new Option('Heading 2 <h2>','h2');
        styleSelect.options[idx++] = new Option('Heading 3 <h3>','h3');
        styleSelect.options[idx++] = new Option('Heading 4 <h4>','h4');
        styleSelect.options[idx++] = new Option('Heading 5 <h5>','h5');
        styleSelect.options[idx++] = new Option('Heading 6 <h6>','h6');
        styleSelect.options[idx++] = new Option('Address <address>','address');
        styleSelect.options[idx++] = new Option('Formatted <pre>','pre');
Avatar billede windcape Praktikant
31. maj 2007 - 00:39 #4
ups, ignorer mit onchange event i overstående :-)
Avatar billede w13 Novice
31. maj 2007 - 01:48 #5
Jeg skal faktisk bruge en onchange! ;)
Men jeg må afprøve det i morgen. Du kan bare oprette et svar nu, hvis du vil, så ser jeg på det! :)
Avatar billede olebole Juniormester
31. maj 2007 - 11:34 #6
<ole>

Hvis det skal være i dette årtusindes kode, bør man bruge createElement og ikke new Option.

På den anden side, er ingen af de to store browseres editor noget, der hører til i dette årtusinde. I en online-editor kan man såmænd skrive, hvad somhelst uden koden bliver dårligere  =)

/mvh
</bole>
Avatar billede windcape Praktikant
31. maj 2007 - 20:14 #7
"Hvis det skal være i dette årtusindes kode, bør man bruge createElement og ikke new Option."
Ja, men det rendere ikke korrekt OleBole.

Ved at bruge new Option expander ens select korrekt i størrelse afhæning af dine options indhold.
Avatar billede olebole Juniormester
04. juni 2007 - 12:49 #8
Okay ... jeg er ikke stødt ind i problemet. Hvilke browsere har du haft problemer i?
Avatar billede w13 Novice
14. juni 2007 - 16:13 #9
Jeg har benyttet windcapes løsning, som virker fint. Hvis du lige opretter et svar! :)
Avatar billede olebole Juniormester
15. juni 2007 - 12:25 #10
Hvilke renderings problemer skulle der være med DOM - og i hvilke browsere?
Avatar billede w13 Novice
22. juni 2007 - 00:02 #11
Olebole >> Du siger, at der ikke er mange, der laver Ajax ordentligt. Og med det mener du blandt andet behandlingen af output fra det kaldte dokument.

Men er der også stor sandsynlighed for dårligt Ajax, når man blot kører en ASP-/PHP-side uden at få denne sides output igen? Dvs. eventuelt en side, som opdaterer en database, men ikke returnerer noget.

Naturligvis skal en sådan side ikke kaldes hvert 100. ms, men alligevel..
Avatar billede olebole Juniormester
22. juni 2007 - 12:24 #12
Ja, det er der i teorien. Problemerne opstår først og fremmest omkring DOM-koden - og ved evt OOP'ing i JavaScript ... og primært i IE. De samme problemer kan opstå (og gør det) ved alm. webkodning, hvor sider konstant skifter - men med AJAX tydeliggøres de ved, at der ikke skiftes side og beslaglagt hukommelse derfor ikke frigives.
Ovenikøbet er der en hel del situationer, hvor beslaglagt hukommelse ikke engang frigives ved sideskift - men hvor browseren skal lukkes helt ned for at frigive hukommelse. I GoogleMaps API'et ligger således en metode, der skal kaldes på onunload for at frigive hukommelse og løser dette problem ... men det er desværre noget af et særsyn.

Bare en ting som, hvornår man append'er eventlisteners, har betydning. Sættes en eventlistener på et element, der endnu ikke er indsat i dokumentets DOM, opretter IE et lokalt script-scope omkring det 'fritsvævende' element.
Når elementet indsættes i dokumentet og det derfor indgår i dokumentets almene scope, destrueres det lokale scope ikke - og udgør derfor en memory-leak.
Morale: Sæt _altid_ eventlisteners, _efter_ et element er indsat i dokumentet!

Der er som sagt flere ting, der bør tages hensyn til og jeg agter at komme med en håndfuld artikler om emnet. Det begyndte med én, men greb om sig, da emnet _er_ meget omfattende. De er nok færdige hen på eftersommeren  =)
Avatar billede olebole Juniormester
22. juni 2007 - 12:28 #13
PS: Brug _aldrig_ GET, når du bruger AJAX! Der sker noget caching på grund af de 'unikke' URL'er, hvilket kan blive ret katastrofalt ved f.eks. en chat-app, hvor kaldene er rigtig mange - og fortsætter i lange perioder.

Morale: Brug _altid_ POST ved AJAX  ;o)
Avatar billede w13 Novice
22. juni 2007 - 13:02 #14
Takker! Glæder mig til artiklerne! :)
Avatar billede w13 Novice
25. juli 2007 - 15:09 #15
Windcape, opretter du lige et svar? :)
Avatar billede w13 Novice
26. juli 2007 - 21:26 #16
Ja, ellers så lukker jeg da bare :) Men du får lige lidt tid til at gi' et svar..
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