onclick bei Liste

JoeSilencio

Grünschnabel
Hallo allerseits.

Kleine frage zu JavaScript die mich sehr verwirrt

Code:
function test(hallo){
alert(hallo);
}

function ...

for (var key in test){

var aName = document.createElement("a");
aName.onclick = function() { test(key) };
aName.innerHTML = "BLA";

document.appendChild(aName);
}

Wenn ich nun das ganze laufen lasse und den onlick machen will,
erscheint immer der selbe Alert. test ist eine Liste von verschiedenen Elementen.
Eigentlich dachte ich, dass der key spezifische Alert kommt, aber bei 10
Elementen erschein immer nur das letzte Element in der Liste.

Vielleicht könnt ihr mir ja weiterhelfen

Danke im voraus
 
Hi,

wie sieht denn Dein Array "test" aus?
Eventuell kommt es schon zu Konflikten, da eine Funktion "test" und anscheinend ein Array "test" vorhanden ist.

Die onclick-Zuweisung muß Du dann auch so machen:
aName.onclick = "javascript: test("+key+");";

Gruß tyg3r
 
das Array kommt von java her und wird via Ajax gefüllt (java.util.Map)
die Map stimmt soweit...wenn ich ein Test mit href mache haben
alle 10 den richtigen Link

das mit test war eigentlich nur als Beipsiel gedacht, um den Kern zu zeigen
heissenn tun die eigentlich anders.
kann mal etwas mehr Code schicken.

Code:
for (var key in map){
				var url = map[key];
				
				var tr = document.createElement("tr");
				
				var tdName= document.createElement("td");
				var tdEdit = document.createElement("td");
				
				var aName = document.createElement("a");
				aName.setAttribute("href",  url);
				aName.innerHTML = key;		
				tdName.appendChild(aName);
						
				var aEdit = document.createElement("a");
				aEdit.innerHTML = '$i18n.getIcon("icon.edit")';
				aEdit.onclick = function() { edit(url, key)};
				tdEdit.appendChild(aEdit);

..und alles ins dok adden

hier würde es der edit entsprechen was vorhin test war.
vielleicht etwas anschaulicher so.

das href stimmt immer und gibt auch das richtige aus, hingegen
die edit(url,key) immer nur auf das letzte Element reagiert.
 
Zuletzt bearbeitet:
Die onclick-Zuweisung muß Du dann auch so machen:
aName.onclick = "javascript: test("+key+");";
Das ist falsch. Die Angabe von "javascript: " ist nur im href Attribut vorzunehmen. Bei Event Handler Attributen ist der Präfix "javascript:" völlig fehl am Platz. Es bringt auch nichts dort einen String anzugeben.

Das Problem ist, das in den anonymen Funktionen (closures) immer die gleiche Variable gebunden wird. Der Wert der Variablen (key) wird geändert, ist aber in allen Funktionen gleich da immer auf die gleiche Variable Bezug genommen wird.

Versuch's mal so:
Javascript:
function func() {
  var nf = function(p) { return function() { f(p); } };
  
  for (var key in list) {
    var a = document.createElement("a");
    a.onclick = nf(key);
    ...
  }
}
Gruß
 
Hi,

ja, weil Du die Funktion immer wieder neu definierst (überschreibst).
deshalb:
aName.onclick = "edit('"+url+"', '"+key+"')";

Gruß tyg3r
 

Neue Beiträge

Zurück