Gekapselter Code - Firefox streikt!

DataFox

Erfahrenes Mitglied
Hi

Ich habe neulich mein JavaScript gekapselt. Im MSIE funktioniert alles. Aber der Firefox streikt:

Code:
function StandardFuncs() {
	this.addEvent = function(eo, eventType, function_name) {
		if (eo.addEventListener) {
			eo.addEventListener(eventType, function_name, false);
		} else if (eo.attachEvent) {
			eo.attachEvent("on"+eventType, function_name);
		}
	}
}

function LauraScript() {
	var SF = new StandardFuncs();

	// this-Objekt "closuren"
	var thisObj = this;
	
	thisObj.docOnclickFunc = function(e) {
		if(!e) e = window.event;
		var eo = e.srcElement || e.target;
		alert(eo.tagName);
	}
	SF.addEvent(window.document, 'click', function(){thisObj.docOnclickFunc(e);});
}

Firebug markiert mir hier in gelb die Zeile

Code:
SF.addEvent(window.document, 'click', function(){thisObj.docOnclickFunction(e);});

sobald ich irgendwo klicke.

Der MSIE macht genau das was er soll: Wenn ich klicke, erhalte ich ein Alert mit dem tagName des angeklickten Elements...

hat jemand eine Idee wo es hier klemmt?

Gruß
Laura
 
1. Deine Funktion erwartet als 3.Parameter den Funktionsnamen, du übergibst aber den kompletten Code der Funktion.

2.
Code:
eo.addEventListener(eventType, function_name, false);
Wenn du willst, dass dort der Event dem Listener übergeben wird, musst du den 3.Parameter auf true setzen.

Ergo:
Code:
function StandardFuncs() {
	this.addEvent = function(eo, eventType, function_name) {
		if (eo.addEventListener) {
			eo.addEventListener(eventType, function_name, true);
		} else if (eo.attachEvent) {
			eo.attachEvent("on"+eventType, function_name);
		}
	}
}

function LauraScript() {
	var SF = new StandardFuncs();

	// this-Objekt "closuren"
	var thisObj = this;
	
	thisObj.docOnclickFunc = function(e) {
		if(!e) e = window.event;
		var eo = e.srcElement || e.target;
		alert(eo.tagName);
	}
	SF.addEvent(window.document, 'click', docOnclickFunc);
}
 
Hi Sven

der Grund für

Code:
SF.addEvent(window.document, 'click', function(){thisObj.docOnclickFunction(e);});

ist, das wenn ich einfach nur den Funktionsnamen übergebe der Browser meint, das docOnclickFunction undefiniert ist. Die addEvent Funktion steht in einem anderen Kontext bzw. Namespace (oder so ähnlich), und in diesem ist diese Funktion dann unbekannt.

Code:
SF.addEvent(window.document, 'click', thisObj.docOnclickFunction);

geht leider auch nicht... ich habe da schon alles mögliche probiert, und am ende klappte es nur mit einer anonymen function. der MSIE schluckt es auch, nur der FF weigert sich.

Habs aber nochmal wie von Dir vorgeschlagen ausprobiert, bekomme wieder die docOnclickFunction ist undefiniert Fehlermeldung...

Hast Du eine Idee wie man die Funktion im richtigen Kontext aufrufen kann?

Gruß
Laura
 
Hast Du eine Idee wie man die Funktion im richtigen Kontext aufrufen kann?

Keine Ahnung, ich weiss ja nicht, in welchem Kontext du sie aufrufst.
Das hier geht bei mir problemlos:
Code:
<html>
<head>
<title>Test</title>
<script type="text/javascript">
<!--
function StandardFuncs() {
	this.addEvent = function(eo, eventType, function_name) {
		if (eo.addEventListener) {
			eo.addEventListener(eventType, function_name, true);
		} else if (eo.attachEvent) {
			eo.attachEvent("on"+eventType, function_name);
		}
	}
}

function LauraScript() {
	var SF = new StandardFuncs();

	// this-Objekt "closuren"
	var thisObj = this;
	
	thisObj.docOnclickFunc = function(e) {
		if(!e) e = window.event;
		var eo = e.srcElement || e.target;
		alert(eo.tagName);
	}
	SF.addEvent(window.document, 'click', docOnclickFunc);
}
LauraScript();
//-->
</script>

</head>
<body>
<b>Klick</b> <i>mich</i> <u>an</u>
</body>
</html>
 
Hi Sven,

danke Dir für die Hilfe! Ich habe bei der gekapselten addEvent-Function das this-Objekt closured, also thisObj = this, und siehe da: es läuft! wahnsinn... was so ein paar Zeichen anrichten können. Hat mich den ganzen Samstag gekostet ;)

Also nochmal vielen Dank!! Scheint jetzt zu laufen

Gruß
Laura
 
Mich wundert ehrlich gesagt das dieses überhaupt geht ;)

Hätte das ja so gemacht :

Code:
function StandardFuncs () {
    this.addEvent() {
    }
}

//Methode a Methode privat
function LauraScript () {

   function docOnClick (evt) {
   }    

   var SF = new StandardFuncs();
        SF.addEvent(document,'click',docOnClick);
}

oder

Code:
function LauraScript () {
    var thisObj = this;   // LauraScript inhalte Festnageln damit wir es wieder finden

    // priviligierte Methode
    this.docOnClick = function () {
    }

    var SF = new StandardFuncs();
         SF.addEvent(document,'click',thisObj.docOnClick);
}

Variante a hat den Vorteil das man von aussen an docOnClick nicht rankommt. Bei Methode b kann man eine Instanz vom Objekt bilden und es zünden was zu unerwünschten Ergebnissen führen kann.
 
Hi

danke für die Tipps :)
Werde mal bei Gelegenheit noch ein bisschen rum testen. Aber so wie ich es jetzt hab, scheint es zu klappen. Bin selbst etwas überrascht...aber MSIE 6.0 und Firefox 2 geben grünes Licht.

Gruß
Laura
 

Neue Beiträge

Zurück