Avatar billede superbent Nybegynder
02. juni 2008 - 00:15 Der er 21 kommentarer og
1 løsning

Hvordan opretter man en select box med createElement?

Hejsa,

Er der nogen der kan hjælpe med at indsætte:

<option value="x">x</a> i min select.


Jeg har pt. følgende kode (virker fint nok):
the_select = document.createElement('select');
the_select.setAttribute('name', 'material_name[]');
document.getElementById("materials_div").appendChild(the_select);


Jeg vil nu have tilføjet options til min select, og har prøvet følgende som _ikke_ virker:

the_select_option = document.createElement('option');
the_select_option.setAttribute('value','1');
document.getElementById("materials_div").appendChild(the_select_option);

Er der nogen der har en løsning til dette?

Samt hvis jeg har lavet noget der ikke virker i eks. IE må i meget gerne gøre mig opmærksomme på dette.

På forhånd tak
Avatar billede olebole Juniormester
02. juni 2008 - 00:35 #1
<ole>

IE forstår ikke:

the_select = document.createElement('select');
the_select.setAttribute('name', 'material_name[]');

Den vil i stedet have:

the_select = document.createElement('<select name="material_name[]">');

- hvilket er hamrende invalid kode  :o|

I FF kan koden se sådan ud:

the_select = document.createElement('select');
the_select.setAttribute('name', 'material_name[]');

the_select_option = document.createElement('option');
the_select_option.setAttribute('value','1');
the_select_option.appendChild( document.createTextNode("En eller anden tekst") );

the_select.appendChild(the_select_option);
document.getElementById("materials_div").appendChild(the_select);

- og så må du som sagt oprette selve select-elementet på den før viste måde i IE

/mvh
</bole>
Avatar billede olebole Juniormester
02. juni 2008 - 00:37 #2
- men du er i øvrigt absolut nødt til at have en IE under Windows, hvis du vil skrive til WWW. Ellers har du ingen anelse om, hvordan dine sider ser ud hos laaaaaangt størstedelen af nettets brugere  ;o)
Avatar billede superbent Nybegynder
03. juni 2008 - 00:37 #3
Tak olebole, kommer du med et svar?

Jeg har IE, men jeg tænkte mere på hvad workaround er på min kode men den har du skrevet.

Er det muligt du på fingrene lige har koden til at finde forskel på IE og andre browsere?

if (explorer) {} else {}

Mange tak for din hurtige hjælp.
Avatar billede olebole Juniormester
03. juni 2008 - 00:55 #4
Tjaa, i lige netop denne situation ville jeg nok spørge på browsernavn:

var sUa = navigator.userAgent.toLowerCase();
if (sUa.indexOf("msie")>-1 && sUa.indexOf("opera")<0) {
    // Det er en IE
} else {
    // Det er ikke en IE
}
Avatar billede olebole Juniormester
03. juni 2008 - 00:58 #5
- altså:

var the_select = the_select_option = null,
sUa = navigator.userAgent.toLowerCase();
if (sUa.indexOf("msie")>-1 && sUa.indexOf("opera")<0) {
    the_select = document.createElement('<select name="material_name[]">');
} else {
    the_select = document.createElement('select');
    the_select.setAttribute('name', 'material_name[]');
}
the_select_option = document.createElement('option');
the_select_option.setAttribute('value','1');
the_select_option.appendChild( document.createTextNode("En eller anden tekst") );

the_select.appendChild(the_select_option);
document.getElementById("materials_div").appendChild(the_select);
Avatar billede olebole Juniormester
03. juni 2008 - 01:03 #6
Indsæt alle options, før du append'er select'en til 'materials_div'.

Hvis du f.eks. skal have sat en onchange handler på select elementet, bør denne dog først sættes _efter_, select elementet er appended til 'materials_div'.
Avatar billede olebole Juniormester
03. juni 2008 - 01:37 #7
Skal man lave mange form kontrol elementer, vil en wrapper funktion nok være en god idé. Jeg har lige skrevet en (hvis jeg skal sige det selv) ret fiks én af slagsen:

function createNamedElm(sTag, sName) {
    var sUa = navigator.userAgent.toLowerCase();
    createNamedElm = sUa.indexOf("msie")>-1 && sUa.indexOf("opera")<0) ? ie : ff;
    return createNamedElm(sTag, sName);
    function ie(sTag, sName) {
        return document.createElement("<"+sTag+" name='"+sName+"'>");
    }
    function ff(sTag, sName) {
        var o = document.createElement(sTag);
        o.setAttribute("name", sName);
        return o;
    }
}

Det fikse er, at når funktionen afvikles første gang, tjekkes for browsermærke. Er det en IE, skiftes indmaden af funktionen 'createNamedElm' ud med indmaden af funktionen 'ie'.
Ellers skiftes indmaden af funktionen 'createNamedElm' ud med indmaden af funktionen 'ff'.
Så snart det er sket, kalder funktionen sig selv og returnerer resultatet til det oprindelige kald.

Din kode vil så se sådan ud (udover funktionen ovenfor):

var the_select = the_select_option = null;
the_select = createNamedElm("select", "material_name[]");
the_select_option = document.createElement('option');
the_select_option.setAttribute('value','1');
the_select_option.appendChild( document.createTextNode("En eller anden tekst") );

the_select.appendChild(the_select_option);
document.getElementById("materials_div").appendChild(the_select);
Avatar billede olebole Juniormester
03. juni 2008 - 01:45 #8
Ups! Der var en fejl:
    createNamedElm = sUa.indexOf("msie")>-1 && sUa.indexOf("opera")<0 ? ie : ff;
Avatar billede superbent Nybegynder
03. juni 2008 - 22:16 #9
Det må jeg nok sige olebole, du har virkelig hjulpet mig enormt, mange tak (bukker).

Jeg har et lille spørgsmål eller måske nærmere et ønske.

I FF ser det helt perfekt ud, i IE ser det også ud som det skal, men hver gang jeg trykker på min knap for at tilføje nye select bokse i min div boks der er 225px bred, ligger de sig ved siden af hinanden i IE (og deraf ødelægger designet), hvor i FF er de under hinanden som jeg ønsker.

Er det noget du ved om det er en fejl i IE, eller om man måske skal lave en:
createElement('br'); (som jeg ikke lige synes virker)

Sig endelig til hvis du synes det kræver et nyt spørgsmål eller lignende.

På forhånd mange tak
Avatar billede superbent Nybegynder
03. juni 2008 - 22:21 #10
Af en underlig grund når jeg tilføjer eksempelvis:

the_select_opt = document.createElement('optgroup');
the_select_opt.setAttribute('label','Test');

the_select.appendChild(the_select_opt);

Virker den fint i IE og i FF - men i Opera(i hvert fald mini) ser det ud som om ingen optgroup findes (viser kun options) - har du et ekspert(en)råd der?
Avatar billede roenving Novice
04. juni 2008 - 00:50 #11
Måske noget af den mærkværdighed, jeg stødte ind i i http://www.eksperten.dk/spm/830175 ?-)
Avatar billede superbent Nybegynder
04. juni 2008 - 23:02 #12
roenving: Tak for dit link, men det ser ud til at i operamini kan jeg ikke få optgroup til at komme frem ligemeget om jeg benytter:

<optgroup label="yada"> eller <optgroup>yada</optgroup>

Du har måske en idé? :)
Avatar billede olebole Juniormester
05. juni 2008 - 14:59 #13
- måske kan denne kaste lidt lys over noget:
    http://www.w3.org/2005/MWI/BPWG/techs/XhtmlBasic11Support

Kik under 'Support of forms' ...(?)
Avatar billede superbent Nybegynder
05. juni 2008 - 18:36 #14
olebole:

Du har ret - ev, det virker overhovedet ikke... what to do what to do...

Hvis det så var muligt at lave optgroup/kategori som en alm. <option> hvor teksten bare var fed og value = 0, så ville den ellers gå :)

Tak for jeres hjælp.
Avatar billede olebole Juniormester
05. juni 2008 - 20:31 #15
Måske, du kunne:

<style type="text/css">
.optgroup {
    font-weight: bold;
    font-style: italic;
}
</style>

<script type="text/javascript">
function test4group(oSel) {
    var aOpts = oSel.getElementsByTagName("option");
    var nLastInx = oSel.getAttribute("lastInx") || 0;
    if (aOpts[oSel.selectedIndex].className=="optgroup") oSel.selectedIndex = nLastInx;
    oSel.setAttribute("lastInx", oSel.selectedIndex);
}
</script>

<select onchange="test4group(this)">
    <option value="-1">Vælg ...</option>
    <option value="">Testing A</option>
    <option class="optgroup" value="">Testing B</option>
    <option value="">Testing C</option>
    <option value="">Testing D</option>
    <option value="">Testing E</option>
</select>

Det virker i FF ... men hvad gør ikke det?  :o|
Avatar billede superbent Nybegynder
05. juni 2008 - 22:25 #16
Det var en genial måde lige at komme uden om det - og det virker i FF dog ikke i IE og Opera Mini, ev :)

Ellers tak for forslaget
Avatar billede olebole Juniormester
05. juni 2008 - 23:04 #17
Virker scriptet i Opera Mini? Hvis det gør, kunne du måske sætte en baggrunds- og forgrundsfarve på din 'optgroup' option i stedet. Det virker i hvertfald i IE  =)
Avatar billede mclemens Nybegynder
05. juni 2008 - 23:07 #18
(05/06-2008 22:25:16 - dog ikke i IE og Opera Mini, ev :))
Avatar billede olebole Juniormester
05. juni 2008 - 23:16 #19
mclemens >> vi kan ikke se, om det er font stylingen eller scriptet, der ikke virker i Opera Mini. I IE virker scriptet, men ikke font stylingen. Styling af bag- og forgrundsfarve virker dog i IE. Derfor spørger jeg  ;o)
Avatar billede mclemens Nybegynder
06. juni 2008 - 00:04 #20
Nåja, jeg beklager Ole :)
Avatar billede olebole Juniormester
06. juni 2008 - 15:24 #21
- no sweat  ;o)
Avatar billede superbent Nybegynder
07. juni 2008 - 23:24 #22
Ja ellers tak for forslaget - jeg prøver med det jeg har nu, og ser hvor det bringer mig, ellers vender jeg sikkert frygteligt tilbage :)
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