Selectbox-Eigenschaft "onChange" deaktivieren, nach Einfügen einer weiteren Selectbox

Davicito

Erfahrenes Mitglied
Hallo... eine Frage.

Wenn ich eine Selectbox klonen, werden alle Eigenschaften/Attribute mit geklont, was wirklich sehr praktisch ist. Und es klappt auch prima... Nur möchte ich aber, wenn ich beim Erzeugen/Klonen, ab der 2. Selectbox, die Eigenschaft "onChange", der vorigen Selectbox wieder löschen bzw. deaktivieren, damit nur die aktuell neu erzeugte Selectbox auf onChange reagiert. Das soll mit removeAttribute() funktionieren. Nur muss ich das ja bei dem zu letzt eingefügten ChildElemend/Knoten machen... Jetzt die Frage..

wie bekomme ich jetzt das ChildElement? um da removeAttribute() anzuwenden?

Liebe Grüße.
 
So, wie du es beschreibst, stehen alle select's direkt hintereinander, da kannst du previousSibling nutzen.

Sollte die Struktur anders sein, müsste man diese kennen, um eine DOM-basierte Antwort geben zu können.

Was immer funktionieren sollte: speichere das jeweils neu erzeugte <select> in einer Variablen, dann kannst du beim nächsten clonen auf diese Variable zugreifen.

Zum onclick ansich: removeAttribute könnte in älteren IE-Versionen problematisch sein, ich würde daher empfehlen stattdessem der onclick-property des Elements eine leere Funktion zuzuweisen:
Code:
obj.onclick=function(){}
 
Hi Abuzze,

ja die Selectboxen stehen hintereinander in einem Formular. Wobei das erste im PHP-Code verankert ist und die anderen dynamisch zur Laufzeit mit onChange erzeugt werden.


PHP:
...
<?php
	echo'<form name="formid" >';	   
        	
      echo'<select id="1" size="1" maxlength="20" onChange="knAuswahlFeld(this)">';
      echo'<option> </option>';									
      while($row_dat = mysql_fetch_object($result_dat))
      {
         	echo'<option value='.$row_dat->Kunden_ID.'> '.$row_dat->Kunden.'</option>';
      { 			
      echo'</select>';            
      echo'<input type="Button" value="senden" name="b">';
      echo'</form>';
?>
...
Javascript:
function knAuswahlFeld(obj)
{
        var newSelectElement = obj.cloneNode(true);
					
	// Erstellt ein ZeilenumbruchKnoten <br>
	var br = document.createElement("br");
	  	 // Fügt ein TagNode <br> - für Zeilenumbruch ein - in das Formular ein
		 document.formid.appendChild(br);
		 // Fügt neuen Knoten Selectbox in das Formular ein	
		 document.formid.appendChild(newSelectElement);
}

Ich werd mir gleich mal "previousSibling" anschauen... danke dir dafür

Zum onclick ansich: removeAttribute könnte in älteren IE-Versionen problematisch sein, ich würde daher empfehlen stattdessem der onclick-property des Elements eine leere Funktion zuzuweisen:
Code:
obj.onclick=function(){}

...also einen Leer-Konstruktor... ok!

Ich meld mich.. danke!
 
Zuletzt bearbeitet:
Danke...

ich hab mich mal rangesetzt und etwas in Erfahrung gebracht. Aber ganz habe ich das noch nicht verstanden, mit dem Sibling. Ich weiß das ich irgendwie mich von Note zu note hangeln kann, um Eigenschaften zu erfragen bzw. zu verändern... aber ich bräuchte irgendwie mal ein kleines Beispiel, um das von der Syntax besser zu verstehen.

Danke dir Trotzdem.
 
kleines Beispiel:

Code:
<b onclick="alert(this.nextSibling.tagName)">click mich</b><br/><i>ich bin nicht nextSibling von b</i>

Daran siehst du auch gleicch das Problem mit deinem Code, die <select> stehen nicht direkt hintereinander, der alert liefert ein BR, denn nach dem <b/> folgt ein <br/>. nextSibling liefert den nächsten Nachbarknoten eines Knoten.

Anderes Beispiel:
Code:
<b onclick="alert(this.nextSibling.tagName)">click mich</b>
<i>ich bin nicht nextSibling von b</i>

Jetzt sollte der alert eigentlich I ergeben, das <br/> ist weg. Es ergibt aber "undefined".

Warum: es gibt diverse Arten von Knoten, Element-Knoten(wie bspw. <i/>,<br/> oder <b/>), aber auch z.B. Textknoten. Die Inhalte der <i/> und <b/> von oben sind solche Textknoten, aber auch der Zeilenumbruch zwischen <b/> und <i/> ist ein Textknoten, und dieser ist jetzt das nextSibling von <b/>. Der alert ergibt "undefined", weil Textknoten keine tagName-Eigenschaft haben.

Um auf deine Funktion zurückzukommen:
eigentlich ist es ausreichend, wenn du nach jener Zeile:
Code:
var newSelectElement = obj.cloneNode(true);
folgendes einfügst:
Code:
obj.onclick=function(){}
Der clone ist bereits erzeugt, du kannst jetzt das onclick im Ursprungselement überschreiben, ohne daß es Auswirkungen auf den clone hat.
 
Zurück