Hallo,
Mit Attributen wäre es:
buttons[0].onclick = function() {sendInfo.addGoal(id, 0);};
Voraussetzung ist allerdings, dass sendInfo und id zum Zeitpunkt des Klicks auf den Button einen Wert haben.
sendInfo muss tatsächlich noch als globale Variable zur Verfügung stehen, id aber nicht - das ist ja der Sinn der Closure. Man kopiert die lokale Variable id in den Scope der anonymen Funktion. Was mit der lokalen Variable dann passiert, ist egal. Sie ändert ja vor allem ihren Wert durch die for-Schleife. An der Variable id im Scope der erzeugten Funktion ändert das nichts, die existiert selbst dann noch, wenn die lokale Variable id längst passé ist, weil die Funktion addBehaviour beendet wurde.
Ja, die Variable existiert noch, aber immer mit dem Wert, den sie _zuletzt_ innerhalb von addBehaviour gehabt hat. Das ist das Problem, welches Struppi auch ansprach.
Beispiel:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Text des Titels</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript">
<!--
var id = 100; //window.id
function addBehaviour() {
var table = document.getElementsByTagName('table')[0];
var trs = table.getElementsByTagName('tr');
for(var i=0; i < trs.length; i++) {
var tr = trs[i];
var buttons = tr.getElementsByTagName('button');
var id = tr.getAttribute('id').slice(1); // id im scope addBehaviour
buttons[0].onclick = function() {alert(id + " : " + window.id + " : " + this.parentNode.parentNode.id);}
}
}
//-->
</script>
</head>
<body onload="addBehaviour();">
<table>
<tr id="g42">
<td>
<button>Button in TR mit ID g42</button>
</td>
</tr>
<tr id="g43">
<td>
<button>Button in TR mit ID g43</button>
</td>
</tr>
<tr id="g44">
<td>
<button>Button in TR mit ID g44</button>
</td>
</tr>
</table>
</body>
</html>
viele Grüße
Axel