イナヅマTVログ

SafariでEvent.MOUSE_LEAVEが使えない、どうしようこうしよう

| 0件のコメント

Safari で Event.MOUSE_LEAVE が使えません。
ということは、マウスがステージを外れたことを検知できません。

drag操作を必要とする時すこぶる都合が悪い。

target.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
 
function onDown (e:MouseEvent):void {
	target.removeEventListener(MouseEvent.MOUSE_DOWN, onDown);
	stage.addEventListener(Event.MOUSE_LEAVE, onLeave);
	stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
	// start drag
}
 
function onLeave (e:Event):void {
	// leave: stop drag
	target.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
	stage.removeEventListener(Event.MOUSE_LEAVE, onLeave);
	stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
}
function onUp (e:MouseEvent):void {
	// up: stop drag
	target.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
	stage.removeEventListener(Event.MOUSE_LEAVE, onLeave);
	stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
}

こんな感じ。
Safariが MOUSE_LEAVE を教えてくれないんだなぁ、困った。

MOUSE_OUTも使ってみました。

target.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
 
function onDown (e:MouseEvent):void {
	target.removeEventListener(MouseEvent.MOUSE_DOWN, onDown);
	stage.addEventListener(Event.MOUSE_LEAVE, onLeave);
	stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
	//
	stage.addEventListener(MouseEvent.MOUSE_OUT, onOut);
}
 
function onLeave (e:Event):void {
	// leave
	target.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
	stage.removeEventListener(Event.MOUSE_LEAVE, onLeave);
	stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
	//
	stage.removeEventListener(MouseEvent.MOUSE_OUT, onOut);
}
function onUp (e:MouseEvent):void {
	// up
	target.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
	stage.removeEventListener(Event.MOUSE_LEAVE, onLeave);
	stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
	//
	stage.removeEventListener(MouseEvent.MOUSE_OUT, onOut);
}
// OUT
function onOut (e:MouseEvent):void {
	var px:Number = e.stageX;
	var py:Number = e.stageY;
	if (px <=0 || px >= stage.stageWidth || py <= 0 || py >= stage.stageHeight) {
		onUp(e);
	}
}

なんだかなぁ〜。
どうにかSafariでもマウスがステージを外れたのを検知できるようになったけど、こんなんでいいのかなぁ。

【環境】
OS X 10.7.2
Safari 5.1.1
Flash Player 11.1.102.55

update 2011-12-22
OS 10.6x + Safari 5.x でも発生。

OS 10.5x + Safari 5.x では発生しません。

OS依存とかひどいよApple。

OS 10.6xでは stageのMOUSE_OUT も取得できない模様。
stageと同じ大きさのMovieClipを置いてコチラにaddEventListenerさせて回避させました。

コメントを残す