Methode mit Node-Objekt als Caller aufrufen ==> this == Caller

Thomas D

Erfahrenes Mitglied
Hallo!

Ich habe in meinem Script eine Funktion titelChange(), die dann aufgerufen wird, wenn sich eine von einer Gruppe von Comboboxes ändert - onchange-Listener. Diese Methode verwendet in Folge dessen this als Verweis auf die Combobox, um bestimmte Operationen auszuführen:

Code:
function titelChange ()
{
	titelCmbChange (this.parentNode, this, createTitelCombobox);
}

Ich habe nun das Problem, dass ich auch Comboboxes habe, die beim Initilialisieren automatisch hinzugefügt werden. Von diesem ändere ich in der Folge der Abarbeitung den selectedIndex auf einen Wert, den ich aus der Datenbank bekomme.

Code:
temp = trStipTitel.getElementsByTagName ("select");
temp[temp.length-1].selectedIndex = '<?php echo $titelliste[$d][0]; ?>');

Leider wird dabei der onchange-Listener nicht aufgerufen, obwohl sich an der Combobox ja etwas ändert - halt nicht durch den User, sondern durch das Programm. Damit nun die Methode trotzdem ausgeführt wird, habe ich sie eine Zeile darunter aufgerufen:

Code:
titelChange ();

Natürlich passt hier dann in titelChange() die Variable this nicht mehr. Ich möchte also gewissermaßen folgendes schreiben können

Code:
temp[temp.length-1].titelChange();

Ich möchte also die Methode so starten, dass this auf den jeweiligen Combobox-Node zeigt. Nur leider weiß ich nicht, wie ich das am besten anstellen soll, da obiges Konstrukt nicht funktioniert.
 
Hallo,

wenn du die Funktion so schreibst:
Javascript:
function titelChange (select)
{
	titelCmbChange (select.parentNode, select, createTitelCombobox);
}
und das onchange-Attribut entsprechend auf "titelChange(this)" setzt, dann kannst du auch
Javascript:
titelChange(temp[temp.length-1]);
schreiben.

Grüße,
Matthias
 
Das geht auch nicht, da ich dann das Problem habe, wie ich die Parametrisierung bei der dynamischen Event-Zuweisung durchführe:

Code:
addEvent (select, "change", titelChange, false);

Hier wird titelChange browserübergreifend als Methode zugewiesen, die bei onchange aufgerufen wird. Daher ich entweder den Aufruf mit einem Parent-Caller oder eine Möglichkeit der Parametrisierung bei addEvent.
 
Code:
/*
Browserübergreifende Event-Registrierung - der IE hat ein anderes Model (attachEvent als der Rest (addEventListener)
obj - JavaScript-Referenz auf HTML-Node
eventType - Stringrepräsentation des jeweiligen Events ohne (!) "on"-Präfix (MS braucht "on", der Rest nicht)
funktion - Angabe der Funktion, die aufgerufen werden soll (kein String)
useCaption - Bool'sche Variable, die festlegt, ob in der Capture- (von oben nach unten) oder Bubbling-Phase (vom Ziel wieder zurück zum Root)) der Event geworfen werden soll
useCaption == false bewirkt IE-Verhalten, da dieses nur Bubbling kennt ==> dies sollte auch standardmäßig verwendet werden

http://www.mediaevent.de/javascript/event_listener.html
*/
function addEvent (obj, eventType, funktion, useCaption)
{
 	if (obj.addEventListener)
	{
		obj.addEventListener (eventType, funktion, useCaption);
		return true;
	}
	else
	{
		if (obj.attachEvent)
		{
			var retVal = object.attachEvent ("on"+eventType, funktion);
			return retVal;
		}
		else
			return false;
	}
}
 
Hallo,

da gibt es aber wesentlich bessere Implementierungen, zum Beispiel die von John Resig:
Javascript:
function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}
Es wundert mich ehrlich gesagt auch, dass die this-Referenz mit deiner Funktion richtig gesetzt ist. Hast du das mal mit dem Internet Explorer 6 getestet?

Jedenfalls könntest du dein Problem dann so lösen:
Javascript:
function titelChange(evt, select)
{
	if (!select) select = this;
	titelCmbChange (select.parentNode, select, createTitelCombobox);
}
// Der manuelle Aufruf:
titelChange(null, temp[temp.length-1]);
Alternativ könnte man auch die Eventfunktion und die Implementierung auseinanderreißen:
Javascript:
function titelChangeHandler()
{
	titelChange(this);
}

function titelChange(select)
{
	titelCmbChange (select.parentNode, select, createTitelCombobox);
}
// Der manuelle Aufruf:
titelChange(temp[temp.length-1]);

Grüße,
Matthias
 
Und wie kann ich bei der neuen Eventregistrierungsmethode Parameter übergeben? Dies bräuchte ich ja, wenn ich titelChange(select) als Funktion aufrufen möchte ...

EDIT: Okay, gerade entdeckt :). Ich probier's mal ...
 

Neue Beiträge

Zurück