Axel Richter: onchange Attribut zur Laufzeit über DOM ändern geht nicht im IE

Beitrag lesen

Hallo,

var select = document.createElement("select");

...
attrib = document.createAttribute("onchange");
attrib.nodeValue = "update(" + id + ");";
select.setAttributeNode(attrib);

  

> ~~~javascript

select.onchange = function() {  

>   update(id);  
> };

Achtung! Böse Falle. ;-) Die beiden Codebeispiele sind nicht identisch. Im ersten wird die Funktion update mit dem _Wert_ der Variable id als Argument aufgerufen, also bspw.: var id=5; ... attrib.nodeValue = "update(" + id + ");";, dann wird update(5) aufgerufen.

Im zweiten Beispiel wird die Funktion update mit der Variablen id als Argument aufgerufen, also update(id). Die Variable id ist dabei, wenn sie nicht global ist, aus dem Gültigkeitsbereich der Funktion, welche das select.onchange = function() {update(id);}; ausführt.

Eventuell muss hier also, je nach Art und Bedeutung der Variablen id, ein Function Object erzeugt werden.

Hier mal ein Beispiel, welches den Unterschied zeigt:

  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  
        "http://www.w3.org/TR/html4/strict.dtd">  
<html>  
<head>  
<title>Titel</title>  
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  
<script language="JavaScript">  
<!--  
var id = 6;  
  
function update(id) {  
  alert(id);  
}  
  
function init() {  
 var a = document.forms[0].tf1  
 var b = document.forms[0].tf2  
 var id = 123;  
 a.onchange = function() {update(id);};  
 //a.onchange = new Function("update(" + id+ ")");  
  
 id = 456;  
 b.onchange = function() {update(id);};  
 //b.onchange = new Function("update(" + id+ ")");  
}  
  
window.onload = init;  
//-->  
</script>  
</head>  
<body>  
<form action="#" method="get">  
<input type="Text" name="tf1" value="" size="20" maxlength="20">  
<input type="Text" name="tf2" value="" size="20" maxlength="20">  
<input type="Text" name="tf3" value="" size="20" maxlength="20">  
</form>  
</body>  
</html>  

Im jetzigen Zustand wird als Wert für id _immer_ 456 übergeben werden, weil immer update(id) aufgerufen wird. Kommentiert man die .onchange = function() {update(id);}; aus und löscht die Kommentarzeichen vor .onchange = new Function("update(" + id+ ")");, dann wird bei a.onchange update(123) und bei b.onchange update(456) aufgerufen.

viele Grüße

Axel