Mouselistener will nicht richtig mit meinem Scroller

Denniz

Erfahrenes Mitglied
Hi Leute,

ich habe mir einen MovieClip Scroller gebaut.
Als Zusatz habe ich versucht den Scroller mit der onMouseWheel funktion auszustatten, so das der scroller sich auch mit dem Mausrad bewegen läßt.
Allerdings funktioniert es nicht so wie gewünscht.
Ich habe ein Beispiel fertig gemacht das mein Problem verdeutlichen soll.
Ich habe eine main.swf in die man zwei swf's laden kann.
Die beiden swf's sind im prinzip gleich nur das in der ersten swf die wheelfunktion auskommentiert ist und dort auch keine mousewheel funktion stattfinden soll, in der zweiten swf gibt es dagegen die whellfunktion.

Hier mein Skript,auf das wesentliche beschränkt:

Code:
scrolling = function () {
	var target:MovieClip = scroller;
	var d:Number = Math.pow(10, 1);
	var dif:Number;
	var scrollHeight:Number = target.scrollTrack._height;
	var contentHeight:Number = thumbs._height;
	var scrollFaceHeight:Number = target.scrollFace._height;
	var maskHeight:Number = mask._height;
	var initPosition:Number = target.scrollFace._y=target.scrollTrack._y;
	var initContentPos:Number = thumbs._y;
	var contentEndSpace:Number = 0;
	var finalContentPos:Number = maskHeight-contentHeight+initContentPos-contentEndSpace;
	var left:Number = target.scrollTrack._x;
	var top:Number = target.scrollTrack._y;
	var right:Number = target.scrollTrack._x;
	var bottom:Number = target.scrollTrack._height-scrollFaceHeight+target.scrollTrack._y;
	var dy:Number = 0;
	var wspeed = 3;
	var speed:Number = 7;
	var moveVal:Number = (contentHeight-maskHeight)/(scrollHeight-scrollFaceHeight);
	var friction:Number = 1;
	target.scrollFace.onPress = function() {
		var currPos:Number = this._y;
		startDrag(this, false, left, top, right, bottom);
		target.scrollFace.scrollEase();
	};
	target.scrollFace.onRelease = function() {
		stopDrag();
		delete this.onMouseMove;
	};
	
	var wheellistnr = new Object();
	wheellistnr.onMouseWheel = function(delta) {
		target.scrollFace._y -= delta*wspeed;
		thumbs._y += delta*wspeed;
		
		if (target.scrollFace._y<=top) {
			target.scrollFace._y = top;
		}
		if (target.scrollFace._y>bottom) {
			target.scrollFace._y = bottom;
		}
	};
	Mouse.addListener(wheellistnr);
	
	MovieClip.prototype.scrollEase = function() {
		this.onEnterFrame = function() {
			r = (target.scrollFace._y-initPosition)/(scrollHeight-scrollFaceHeight);
			dif = ((((initContentPos-(initContentPos-finalContentPos)*r)-thumbs._y)/speed)*friction);
			dy = Math.round(dif*d)/d;
			thumbs._y += dy;
			if (thumbs._y-finalContentPos<=1.5) {
				thumbs._y = finalContentPos;
			}
			if (mask._y-thumbs._y<=1) {
				thumbs._y = mask._y;
			}
		};
	};
};
scrolling();

Ich habe folgende Probleme hierbei:

1. Wenn man die erste swf läd läßt sich dort keine wheelfunktion starten. Wenn man danach die zweite datei läd, dort etwas mit dem mousewheel rumspielt, dann wieder zur ersten swf wechselt dann kann man den scroller dort auch auf einmal mit dem mouserad bewegen. Das sollte doch gar nicht möglich sein da der Skriptteil in dieser Swf auskommentiert ist.
Wieso ist das so und wie bekommt das weg in dieser swf?


2. Wenn man die zweite datei läd, dort das mousewheel bewegt dann sieht man die eigentliche bewegung des scrollings,draggt man dann die scrollleiste hin und her (easingeffekt) und bewegt dann anschließend wieder das mausrad dann ruf man die scrollEase funktion auf :confused:
Dies ist doch aber nicht im wheellistener Skriptteil angegeben und das easing sollte doch nicht aufgerufen werden.
Wieso wird es trotzdem aufgerufen und wie kann man es verhindern?


Ich habe die Beispieldateien hier hochgeladen.


Beste Grüße
 
Hi,

1. Ein Mouse-Listener wird (wie z.B. auch Key-Listener oder Intervalle) global angelegt und verschwindet nicht, wenn Du den MC entfernst, auf dem er definiert wurde. Lädst Du also die zweite Datei und überschreibst sie dann mit der ersten, so bleibt der Maus-Listener erhalten und bezieht sich auf die Elemente des ersten Films (die ja gleich benannt sind). Vor den Entladen eines Films mit Scroller solltest Du daher eine Funktion zum "Entschärfen" aufrufen:
Code:
btn1.onPress = function() {
	container.unlock();
	container.loadMovie("1.swf");
}

btn2.onPress = function() {
	container.unlock();
	container.loadMovie("2.swf");
}
Code:
function unlock() {
	Mouse.removeListener(wheellistnr);
}
(dazu musst Du allerdings die Variable "wheellistnr" als Zeitleistenvariable speichern und nicht als lokale Variable der Funktion "scrolling")

2. Wenn Du das Mausrad bewegst, läuft die onEnterFrame-Methode in der Funktion "scrollEase" natürlich weiter und bewegt den Inhalt in Abhängigkeit der Scroller-Position. Einfachste Methode, das Problem zu umgehen: Lösche die onEnterFrame-Methode beim Aufruf von Mouse.onMouseWheel:
Code:
	wheellistnr.onMouseWheel = function(delta) {
		delete target.scrollFace.onEnterFrame;

Gruß
.
 
Zurück