10. august 2007 - 20:11Der er
13 kommentarer og 1 løsning
hjælp til funktion
Jeg har en række funktioner hvor jeg ønsker at indsætte en variabel fra en xml fil. På en side skal der være flere tekstbokse alle tekstbokse skal benytte samme funktion men der skal noget forskelligt tekst i de forskellige tekstbokse. ----------kode-------------- <html> <head><title></title> <script type="text/javascript" language="javascript"> <!-- Hide from browsers without javascript var txtTextbox = "Search" function addListener(oNode, sEventType, fnHandler) { //If there are prior event handler functions //that have been assigned to this event handler, //then save them: if(oNode[sEventType]) var oldfuncs = oNode[sEventType];
//Assign new function to the //element's event handler: oNode[sEventType] = function () { if (oldfuncs) oldfuncs(); fnHandler(); } }
//Test out the addListener() function: window.onload=function() { var div = document.getElementById("d"); addListener(div, "onfocus", clear); addListener(div, "onblur", unclear); } function clear() { var search = document.getElementById("d"); search.className = "second"; (search.value == txtTextbox) ? search.value = "" : false } function unclear() { var search = document.getElementById("d"); if (search.value == "") { search.value = txtTextbox; search.className = "first"; } else{ search.value == txtTextbox} }
Jeg skal have flere tekstbokse som skal benytte samme funktion men med forskellig value. Hvordan gør jeg det uden at have en hel masse kode, kan man evt. bruge class navnet det er jo det samme for de forskellige tekstbokse?
Du kan ikke bruge setAttribute("className", "value") eller getAttribute("className"). Det burde hedde getAttribute("class"), men IE vil have 'className' ... mens andre (f.eks. Firefox) bruger det korrekte 'class'.
I mine øjne er det med CSS-klasser ligesom med input-elementer: Det er mere eller mindre omsonst at bruge DOM, før browserne i rimelig grad understøtter det :o|
Jeg bruger således stadig den gamle 'JavaScript' property: ELEMENT.className = "value";
Tænk iøvrigt også lige på din for-løkkes effektivitet (eller mangel på samme)!
Hvergang løkken gennmløbes, skal browseren først ud og finde samtlige input-elementer på siden. Derefter skal længden af denne collection findes. Derefter skal alle input-elementer findes endnu engang - og af dem udvælges så nummer i.
Er der 10 input-elementer på siden, hentes med andre ord i hundredevis af elementer for at bruge den viste løkke. I stedet kunne du skrive:
var aInp = document.getElementsByTagName("input"); for (var i=0,j=aInp.length; i<j; i++) { // Gør ting og sager }
Læg her mærke til, at jeg kun henter længden af aInp én gang - og lægger den i 'j', som jeg efterfølgende sammenligner 'i' med ;o)
var aInp=document.getElementsByTagName("input"); for(var i=0,j=aInp.length;i<j;i++){ oInput=aInp[i]; if(oInput.className=="noget"){ switch(oInput.getAttribute("name")){ case "alder":oInput.setAttribute("value","20"); case "email":oInput.setAttribute("value","mail@mail.dk"); } } }
Er den ikke ved at være der så?
Er der i øvrigt fordele ved at oprette variablen "j", i stedet for bare at skrive i<aInp.length, når vi ikke bruger aInp.length andre steder?
Ja, for ellers henter du 'length' for hvert gennemløb. Det er der ingen grund til ... omend det er den mindste performance-forbedring af de viste. Der sker det samme, som hvis du skrev:
var aInp=document.getElementsByTagName("input"); var j = aInp.length; for(var i=0; i<j; i++){
i<j delen af løkken evalueres jo for hvert gennemløb af løkken, så med 10 elementer i array'et evalueres dette udtryk 10 gange ... i modsætning til at det kan gøre én gang. En lille forbedring, men har du mange løkker - og ikke mindst, hvis de arrays, der skal bladres igennem er lange - betyder det noget :)
Det sidste fik jeg trykket lidt uhelsigt ud. Jeg vil hellere udtrykke det sådan:
i<j delen af løkken evalueres jo for hvert gennemløb af løkken, så med 10 elementer i array'et evalueres dette udtryk 10 gange. Du har altså valget mellem at finde arrayets 'length' én gang - og at finde den 10 gange. En lille forbedring, men har du mange løkker - og ikke mindst, hvis de arrays, der skal bladres igennem er lange - betyder det noget :)
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.