Avatar billede tofte Juniormester
15. december 2006 - 22:38 Der er 6 kommentarer og
1 løsning

Medsend parameter til anonym funktion

Hej

Spørgsmålet går på, hvordan man medsender en parameter til en anonym funktion

var myInt
myInt = 3
editAnchor.onclick = function() {
  alert(myInt);
}
Hvis jeg gerne vil medtage myInt inde i min anonyme funktion, hvordan gøres dette ?

Rasmus
Avatar billede olebole Juniormester
18. december 2006 - 12:44 #1
<ole>

Hvad mener du - og hvordan skal det bruges? Som du viser det, er der jo ingen problemer med at få det til at virke - så jeg forstår ikke, hvad du mener  =)

/mvh
</bole>
Avatar billede tofte Juniormester
18. december 2006 - 14:25 #2
Det har du ret i.

Men i koden neden for, hvor problemet opstår forsøger jeg at sende en værdi(et id fra databasen) med til funktionen, så jeg senere ved hvilken jeg skal rette i.

Problemet er, at alle mine links editAnchor sender samme værdi med.


function fillUserTable_postback(){
        if (xmlHttp.readyState == 4) {
            if (xmlHttp.status == 200) {
                var result = String(xmlHttp.responseText);
               
                var mytable    = getElmById("userListTable");
                var mytablebody = document.createElement("tbody");
                var fchild = mytable.firstChild;
                var myVal;
                mytable.removeChild(fchild);
                var splitResult = result.split("\n");
               
                // creating all cells
               
                for(var j = 0; j < splitResult.length-1; j++) {
                    // creates a <tr> element
                    mycurrent_row = document.createElement("tr");
                    var fields = splitResult[j].split(";")
                    for(var i = 0; i < fields.length; i++) {
                        // creates a <td> element
                        mycurrent_cell = document.createElement("td");
                       
                        if (i == 0){
                            var deleteAnchor = document.createElement("a");
                            currenttext = document.createTextNode("Delete");
                            deleteAnchor.setAttribute('onClick','delete('+fields[i]+');');
                            deleteAnchor.setAttribute('href','#');
                            deleteAnchor.appendChild(currenttext);
                            mycurrent_cell.appendChild(deleteAnchor);
                           
                            myVal = String(fields[i]);
                       
                            var editAnchor = document.createElement("a");
                            currenttext = document.createTextNode("Edit"+myVal);
                           
                            editAnchor.setAttribute('href','#'+myVal);
                            editAnchor.setAttribute('name','#'+myVal);
                            editAnchor.onclick = function(){
                                updateUser(this);
                            }   
                            editAnchor.appendChild(currenttext);
                            mycurrent_cell.appendChild(editAnchor);
                       
                            //fillUserData(fields[i]);
                            //hideMainAreas();
                            //show('newUser');
                        }
                       
                        else{
                            currenttext = document.createTextNode(fields[i]);
                            mycurrent_cell.appendChild(currenttext);
                        }
                       
                        mycurrent_row.appendChild(mycurrent_cell);
                    }
                    // appends the row <tr> into <tbody>
                    mytablebody.appendChild(mycurrent_row);
                }
                // appends <tbody> into <table>
               
                mytable.appendChild(mytablebody);


               
            } else {
                alert('There was a problem with the request.');
                alert(xmlHttp.responseText);
            }
          }
 
  }
Avatar billede tofte Juniormester
18. december 2006 - 14:26 #3
Der er lige en fejl i det postede. Det som ikke virker er hvis der står:

                            editAnchor.onclick = function(){
                                updateUser(myVal);
                            }
Avatar billede roenving Novice
24. december 2006 - 14:02 #4
Opret variablen udenfor scriptet ...
Avatar billede olebole Juniormester
27. december 2006 - 11:37 #5
- eller for ikke at få det globale space fyldt op med en bunke variabler, kan du knytte variablen til HTML-elementet:

editAnchor.setAttribute("gnubasse", myVal);
editAnchor.onclick = function(){
                                updateUser(this.getAttribute("gnubasse"));
                            }

Derudover bør man ikke kunne sætte event-handlers som attributter:
    deleteAnchor.setAttribute('onClick','delete('+fields[i]+');');

Lykkes det, så betragt det, som værende en browser-bug  =)

I virkeligheden bør du bruge attachEvent:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/attachevent.asp

- og addEventListener:
    http://developer.mozilla.org/en/docs/DOM:element.addEventListener

- alt efter, hvad browseren understøtter
Avatar billede tofte Juniormester
27. december 2006 - 14:19 #6
tak for jeres kommentarer. Kan ikke lige smide et svar. Med hensyn til deleteAnchor.setAttribute('onClick','delete('+fields[i]+');'); så virker det heller ikke. Det var bare et halvhjertet forsøg på at få det til at køre. Det ser i hvert fald ud til at virke med oles forslag.

Rasmus
Avatar billede olebole Juniormester
27. december 2006 - 14:37 #7
- og problemet med at skrive noget à la:

myVal = String(fields[i]);
editAnchor.onclick = function(){
    updateUser(myVal);
}

- er, at 'myVal' sættes i en løkke.
Dvs, at den har en ny værdi for hvert gennemløb af løkken. Skete det ikke, kunne den anonyme funktion sagtens refere til en variabel inde i samme funktion, som sætter onclick-handler'en  =)

Skulle man - som roenving foreslår - sætte værdien på en global variabel, ville man skulle oprette en masse globale variabler ... én for hvert gennemløb af løkken.

Selv er jeg dog ikke udelt vild med mit eget forslag om at knytte variablen til HTML-elementet. Jeg foretrækker som oftest at bygge en abstraktion (f.eks. i form af et JS-objekt) - samt en HTML-manifestation af denne abstraktion, som kun bruges til 'håndtag' og 'display' for abstraktionen ... men det, jeg viste ovenfor, er en okay måde at gøre det på for den 'ikke helt stive JS-koder'  ;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