Avatar billede extream Nybegynder
10. august 2007 - 20:11 Der 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}
}
   
// End hiding -->
</script>
</head>
<style type="text/css">
.first{
    color: #999;
}
.second{
    color: #000;
}
</style>
<body>


<input type="text" class="first" value="Search" id="d" />
<input type="text" class="first" value="Firstname" id="e" />


</body>
</html>
---------------/kode-----------------

Håber det giver lidt mening.
Bemærk, der skal ikke være en onclick eller andet på tekstboksene.
Avatar billede w13 Novice
10. august 2007 - 20:38 #1
Hvad er spørgsmålet?
Avatar billede extream Nybegynder
11. august 2007 - 08:55 #2
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?
Avatar billede w13 Novice
11. august 2007 - 15:09 #3
Ja, det kan du godt.

for(i=0;i<document.getElementsByTagName("input").length;i++){
  if(document.getElementsByTagName("input")[i].getAttribute("className")=="noget"){
    'udfør kommando
  }
}
Avatar billede extream Nybegynder
12. august 2007 - 10:23 #4
Perfekt, så mangler der bare det med at value skal puttes ind i funktionen den er jo forskellig fra de forskellige tekstbokse.
Avatar billede w13 Novice
12. august 2007 - 14:46 #5
for(i=0;i<document.getElementsByTagName("input").length;i++){
  oInput=document.getElementsByTagName("input")[i];
  if(oInput.getAttribute("className")=="noget"){
    switch(oInput.getAttribute("name")){
      case "alder": oInput.setAttribute("value","20");
      case "email": oInput.setAttribute("value","mail@mail.dk");
    }
  }
}
Avatar billede olebole Juniormester
12. august 2007 - 16:03 #6
<ole>

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";

/mvh
</bole>
Avatar billede w13 Novice
12. august 2007 - 16:06 #7
Ah ja, class-problemet.

for(i=0;i<document.getElementsByTagName("input").length;i++){
  oInput=document.getElementsByTagName("input")[i];
  if(oInput.className=="noget"){
    switch(oInput.getAttribute("name")){
      case "alder": oInput.setAttribute("value","20");
      case "email": oInput.setAttribute("value","mail@mail.dk");
    }
  }
}
Avatar billede olebole Juniormester
12. august 2007 - 16:15 #8
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)
Avatar billede w13 Novice
12. august 2007 - 16:19 #9
Jeg er lidt træt, tror jeg :)

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?
Avatar billede olebole Juniormester
12. august 2007 - 17:06 #10
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  :)
Avatar billede olebole Juniormester
12. august 2007 - 17:09 #11
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  :)
Avatar billede w13 Novice
12. august 2007 - 17:10 #12
Ja ok. Jeg tænkte ikke lige over, at j<i ikke nødvendigvis er konstant og derfor skal udføres hver gang.. Så lærte jeg lige det.
Avatar billede w13 Novice
28. august 2007 - 12:42 #13
Takker!
Avatar billede olebole Juniormester
28. august 2007 - 14:42 #14
- selv  ;o)
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