[JS] onmouseout dla okna przeglądarki

0

Już ponad godzinę na przemian szukam i zaglądam w kod źródłowy uploadera obrazków na gmailu i na razie nic :/. Buduje "przycinasz" obrazków, podobny do tego od avatarów na gmailu, wszystko idzie nieźle, ale jedna rzecz nieznośnie irytuje, a ja nie umiem tego pokonać :/

Chodzi konkretnie o wykrycie opuszczenia obszaru strony przez kursor myszy. Teraz, jak nie jest to wykrywane, to jak przeciągnę przyciśniętą mysz poza okno, puszcze przycisk i wróce, to mój skrypt zachowuje sie jakby przycisk nadal był wciśnięty :/.

Próbowałem windows.onmouseout, documentOwner, this i jeszze pare innych i nic - albo fatal error, albo owszem - reaguje na mouseout, ale nie tylko z okna, ale z każdego innego obkektu na stronie. parametr "e" przy onmousemove w Fx2 nie przekazuje parametru button, wiec po tym też nie sprawdze...

Z góry dzięki za jakiekolwiek podpowiedzi, ja już ledwo na oczy patrze :(

//edit: sam przeniosłem - gapa ze mnie :P

//edit2: szukam i szukam i jak na razie, to obejście tego buga widze TYLKO w google :/

0

Może spróbuj traktować ostatnie 1-2px okna tak, jakby mysz była już za oknem?

0

próbowałem - nic z tego :/ Nad taką "granicą" trzeba przejeżdżać dosyć wolno, żeby przeglądarka załapała onmouseover :(

0

Rzeczywiście, szybki ruch wystarczy, ale wykombinowałem taki onmouseout dla body:

function body_onmouseout(e)
{
	if( e.pageX < 0 || e.pageY < 0 || e.pageX > document.body.clientWidth || e.pageY > document.body.clientHeight)
		//teraz kursor wypadł za okno
}

i działa :) Oczywiście nie uwzględniłem wersji dla IE z czystego lenistwa.

0

dzięki, jest to w jakiś sposób lepsze rozwiązanie, wręcz prawie optymalne, ale... na Fx2 i Operze nie zawsze "załapuje" opuszczenie okna (pozycja jest podawane jeszcze z "zakresu"), a na IE prawie zawsze nie załapuje :(

oto kod:

function bodyOut(e)
{
	var x; var y; var h; var w;
	
	if (typeof(e) == 'undefined')
	{ //ie
		x = event.clientX + document.body.scrollLeft;
		y = event.clientY + document.body.scrollTop;
	}
	else
	{
		y = e.pageY - window.pageYOffset;
		x = e.pageX;
	}
	
	h = document.documentElement.clientHeight; //Firefox
	if (h == 216) //Opera
		h = document.body.clientHeight;
	
	w = document.documentElement.clientWidth;
	
	document.title = x+'x'+y+', '+w+'x'+h;
	if ((x < 0) || (y < 0) || (x > w) || (y > h))
		dragStop();
}

edit: w IE wystarczyło obsłużyć document.getElementsByTagName('body').item(0).onmouseleave = dragStop; i śmiga lepiej niż na Fx2 :]. Teraz to tylko na Firefoxie czasem nie łapie, ale da się przeżyć :). Jeśli ktoś jednak wpadnie na ulepszenie tego dla Fx, będzie bardzo fajnie :D

0

Aaaa, właśnie, ja to dodałem przez document.addEventListener( 'mouseout', bodyOut, false ); i nie zauważyłem, żeby chociaż raz nie złapało (czasem z delikatnym opóźnieniem).

0

dzięki, dodałem to, ale i tak czasem Fx "nie zauważa" ucieczki mychy. Na szczęście owo "gapiostwo" jest na tyle duże, że onmouseup też przekazuje, jakby mysz była w zasięgu, więc problem uważam za rozwiązany :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1