Zugriff auf Methoden, Eigenschaften von Objekten inerhalb eines Arrays

ozono

Grünschnabel
Hallo Leute, ich habe folgende Frage:

Wenn ich eigene Objekte erstellt habe, die eigene Methoden besitzen,
dann arbeite ich mit diesen Methoden ja über folgende Syntax:

Code:
var MeinObj = new MeinObjekt();

MeinObj.meineMethode();

Wenn ich den Variablennamen des Objekts bei der Instanzierung desselbigen variabel setzen möchte und zwar mit Hilfe des Window-Arrays von Javascript,
wie greife ich dann danach auf die Objekt- Variablen und Methoden zu?

Beispiel:


Code:
	function EineFunktion(name) {
	
	        //Existiert das Objekt im Window-Array nicht?
		if(!window[name]) {
	
                        //Wenn nicht dann variable Variable erzeugen.
			var Var_name = name;

                        //Ein neues Objekt instanzieren und in die variable Variable
                        // speichern.
			window[Var_name] = new MeinObjekt(name);
	
		}
	
                //Auf die Objekt-Methode des Objekts zugreifen, die in
                // der variablen Variable  gespeichert ist.

		window[name].meineMethode();
	
	}
Firebug gib mir die Fehlermeldung:
name.meineMethode is not a function

Welche Syntax ist da die richtige? :confused:

Danke
 
Zuletzt bearbeitet:
Hi,

die Funktion sollte eigentlich funktionieren. Wenn du allerdings versuchst, "name" als Parameter zu übergeben,
Code:
EineFunktion("name")
kommt es zur Fehlermeldung, da es die Eigenschaft window.name bereits gibt.

Ciao
Quaese
 
hallo Quaese,

trotz Änderung des Parameternamens, taucht der gleiche Fehler auf.

Auch wenn es jetzt ein bischen viel ist, aber ich stell hier nochmal den eigentlichen Quelltext hinein.

Code:
<html xmlns="http://www.w3.org/1999/xhtml"  xmlns:svg="http://www.w3.org/2000/svg" xml:lang="de" lang="de">
	<head>
		<title>css-img-test</title>
		<style type="text/css">	
	
			img.imagehover:hover {

				z-index: 10000;

			}

		</style>
		<script type="text/javascript">
		<!--


			function Image_fade(image_id) {
			
			
				var step_factor = 20;
				var activ_in;
				var activ_out;
				var display_width;
				var display_height;
				var display_opac;
				var width_step;
				var height_step;
				var opac_step;
				var not_sett = true;
				var img = document.getElementById(image_id);
			
			
			
				this.sett_fade_in = function() {
			
					window.clearInterval(aktiv_out);
			
					if(not_sett) {
			
						img_width = img.style.width;
						display_width = parseFloat(img_width);
						width_step = (100-display_width)/step_factor;
			
						img_height = img.style.height;
						display_height = parseFloat(img.style.height);
						height_step = (100-display_height)/step_factor;
			
						if(parseFloat(img.style.opacity) < 1) {
			
							opacity = img.style.opacity;
							display_opac = parseFloat(opacity);
							opac_step = (1-display_opac)/step_factor;
			
						}
			
						if(parseFloat(img.style.MozOpacity) < 1) {
			
							opacity = img.style.MozOpacity;
							display_opac = parseFloat(opacity);
							opac_step = (1-display_opac)/step_factor;
			
						}
			
						if(img.filters && parseFloat(img.filters.alpha.opacity) < 100) {
			
							opacity = img.filters.alpha.opacity;
							display_opac = parseFloat(opacity);
							opac_step = (100-display_opac)/step_factor;
			
						}
			
						if(parseFloat(img.style.KHTMLOpacity) < 1) {
			
							opacity = img.style.KHTMLOpacity;
							display_opac = parseFloat(opacity);
							opac_step = (1-display_opac)/step_factor;
			
			
						}
			
						not_sett = false;
			
					}
			
					aktiv_in = window.setInterval("fade_in()", 1);
			
				}
			
			
			
			
			
			
			
			
				function fade_in() {
			
			
					if(parseFloat(img.style.width) < 100) {
			
						img.style.width = parseFloat(img.style.width) + width_step + "%";
						img.style.height = parseFloat(img.style.height) + height_step + "%";
			
						img.style.top = parseFloat(img.style.top) - height_step + "%";
			
						if(parseFloat(img.style.opacity) < 1) {
						
							img.style.opacity = parseFloat(img.style.opacity) + opac_step;
			
						}
			
						if(parseFloat(img.style.MozOpacity) < 1) {
			
							img.style.MozOpacity = parseFloat(img.style.MozOpacity) + opac_step;
			
						}
			
						if(img.filters && parseFloat(img.filters.alpha.opacity) < 100) {
			
							img.filters.alpha.opacity = parseFloat(img.filters.alpha.opacity) + opac_step;
			
						}
			
						if(parseFloat(img.style.KHTMLOpacity) < 1) {
			
							img.style.KHTMLOpacity = parseFloat(img.style.KHTMLOpacity) + opac_step;
			
						}
			
					} else {
			
						window.clearInterval(aktiv_in);
			
						
			
					}
					
				}
			
			
			
			
			
				this.sett_fade_out = function() {
			
					window.clearInterval(aktiv_in);
					aktiv_out = window.setInterval("fade_out()", 1);
			
				}
			
			
			
			
			
				function fade_out() {
			
			
					if(parseFloat(img.style.width) > display_width) {
			
						img.style.width = parseFloat(img.style.width) - width_step + "%";
						img.style.height = parseFloat(img.style.height) - height_step + "%";
			
						img.style.top = parseFloat(img.style.top) + height_step + "%";
			
						if(parseFloat(img.style.opacity) > display_opac) {
			
							img.style.opacity = parseFloat(img.style.opacity) - opac_step;
			
						}
			
						if(parseFloat(img.style.MozOpacity) > display_opac) {
			
							img.style.MozOpacity = parseFloat(img.style.MozOpacity) - opac_step;
			
						}
			
						if(img.filters && parseFloat(img.filters.alpha.opacity) > display_opac) {
			
							img.filters.alpha.opacity = parseFloat(img.filters.alpha.opacity) - opac_step;
			
						}
			
						if(parseFloat(img.style.KHTMLOpacity) < display_opac) {
			
							img.style.KHTMLOpacity = parseFloat(img.style.KHTMLOpacity) - opac_step;
			
						}
			
					} else {
			
						not_sett = true;
			
						window.clearInterval(aktiv_out);
			
					}
					
			
				}
			
			}
			
			
			
			function do_fade_in(image_id) {
			
			
				if(!window[image_id]) {
			
					var Var_name = image_id;
					window[Var_name] = new Image_fade(image_id);
			
				}
			
				window[image_id].start_fade_in();
			
			}
			
			
			function do_fade_out(image_id) {
			
				if(window[image_id]) {
			
					window[image_id].start_fade_out();
			
				}
			
			}


		-->
		</script>
	</head>
	<body>
		<div id="inner"></div>
		<div style="width: 600px; height: 750px; padding: 0px; margin: 0px; text-align: center; background-image: url('DSCF0004_thumb.jpg'); background-repeat: no-repeat; background-position: 250px 300px;">
			<img class="imagehover" onclick="do_fade_in('bild1')" onmouseout="do_fade_out('bild1')" style="filter:alpha(opacity=30); -moz-opacity: 0.3; opacity: 0.3;  -khtml-opacity: 0.3; width: 15%; height: 15%; position: relative; top: 85%; margin: 0px; padding: 0px; z-index: 10000;" border="0px" id="bild1" src="DSCF0004_middle.jpg" />
		</div>
	</body>
</html>
 
Zuletzt bearbeitet:
Hi,

ohne deinen kompletten Code analysieren zu wollen - du greifst mit window['bild1'] nicht auf dein erstelltes Element zu, sondern auf das Bildobjekt im DOM.

Zur Demonstration:
Code:
window.onload = function(){
  var image_id = "bild1";
  var strOut = "";
  for(strEntry in window[image_id]){
    strOut += "window["+image_id+"]["+strEntry+"] = " + window[image_id][strEntry] + ", ";
  }
  alert(strOut);
}
Hier erkennst du, dass es sich um das Bildobjekt handelt. Dieses kennt selbstverständlich die eigenen Methoden nicht.

Vielleicht kannst du ja den Aufruf umgestalten:
Code:
onclick="do_fade_in('my_bild1')"
Innerhalb deines Objekts musst du entsprechend reagideren - z.B.:
Code:
var img = document.getElementById(image_id.split("_")[1]);
Ich hoffe, du kannst damit etwas anfangen.

Ciao
Quaese
 
Danke Quaese,
das hat mir weitergeholfen.
Um meine Objekte von den Parameternamen zu unterscheiden habe ich jetzt ein string mit angehängt:
Code:
	function do_fade_in(image_id) {
			
				
		if(!window[image_id + "_obj"]) {

			window[image_id + "_obj"] = new Image_fade(image_id);
			
		}
			
		window[image_id + "_obj"].sett_fade_in();
			
	}

Aber damit hatten ie6 und ff2 eigentlich keine Probleme.:confused:
Anscheinend gibt es doch Unterschiede zwischen Element-Objekten
die eine id zugeteilt bekommen und selbst instanzierten Objekten mit den selben Variablennamen wie die id?
Um sicher zu gehen habe trotzdem unterschieden.
Eher musste ich noch zwei private funktionen previligieren damit
window.setInterval sie überhaubt findet.

Code:
interv = image_id + "_obj.fade_out()";
aktiv_out = window.setInterval(interv, 1);

außer dem hatte ich noch ein par andere Fehler.
 

Neue Beiträge

Zurück