トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     return function の 消し方 が わかりません
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
レイ
Åê¹ÆNo.43966
投稿日時: 2009-11-18 11:13
新米
居住地: 大阪
投稿: 11
使用環境:
winVista,FlashCS4,AS3,
IE8,FlashPlayer10,
Red5v8rec2ストリーミング配信
return function の 消し方 が わかりません
ステージに ボタンを2つ おいて、 btn1 と btn2
という名前をつけました。

そして、各ボタンに引数を持たせて
addEventListener したり、 removeEventListener 
させたりしたいのですが、

引数を持たせてaddEventListenerさせると
removeしてくれません。

リスナーの消し方をご存知の方、教えてください。

-------------------------------------------------
btn1.addEventListener( MouseEvent.CLICK, onFunc("テスト"));
btn2.addEventListener( MouseEvent.CLICK, removeFunc);

function onFunc( tar:String):Function{
return function(event:MouseEvent):void{
trace(tar);
btn1.buttonMode = true;
}
}

function removeFunc(event:MouseEvent):void{
trace("onFuncを消す");
btn1.buttonMode = false;

//消えなかった命令文
//btn1.removeEventListener(MouseEvent.CLICK,onFunc);
//btn1.removeEventListener(MouseEvent.CLICK,onFunc("テスト"));
//btn1.removeEventListener(MouseEvent.CLICK,arguments.callee);
}

野中文雄
Åê¹ÆNo.43967
投稿日時: 2009-11-18 16:20
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: return function の 消し方 が わかりません
削除できないのではなく、削除する関数を指定すべき参照がないということでしょう。ついでにいえば、厳密な意味で引数が渡せている訳でもありません。したがって、名前のない関数をイベントリスナーに指定すること自体止めた方がよいと思われます。
引用:
myantaさんは書きました:
そして、各ボタンに引数を持たせて
addEventListener したり、 removeEventListener 
させたりしたいのですが、

引数を持たせてaddEventListenerさせると
removeしてくれません。

リスナーの消し方をご存知の方、教えてください。
btn1.addEventListener( MouseEvent.CLICK, onFunc("テスト"));
btn2.addEventListener( MouseEvent.CLICK, removeFunc);

function onFunc( tar:String):Function{
	return function(event:MouseEvent):void{
	trace(tar);
	btn1.buttonMode = true;
	}
}


----------------
 

レイ
Åê¹ÆNo.43972
投稿日時: 2009-11-19 10:19
新米
居住地: 大阪
投稿: 11
使用環境:
winVista,FlashCS4,AS3,
IE8,FlashPlayer10,
Red5v8rec2ストリーミング配信
ありがとうございます!
野中様、お返事ありがとうございました。

なるほど、参照もなく、引数も渡せていなかったのですね…。

引数渡しする際は代わりにグローバル変数などに値を格納して
呼び出せるように回避してみようと思います…!
(もっといい手があるかもしれませんが^^;)

これからは使用しないように気をつけます。
ありがとうございました!
野中文雄
Åê¹ÆNo.43974
投稿日時: 2009-11-19 18:59
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: ありがとうございます!
おやりになりたいことにより対処法は異なるため、先の回答ではあえてスクリプトは掲げませんでした。つぎのような処理で対応できそうでしたら、その方が確実だと思います。
var tar:String = "timeline";
btn1.tar = "instance";  // btn1がMovieClipの場合
btn1.addEventListener( MouseEvent.CLICK, onFunc);
btn2.addEventListener( MouseEvent.CLICK, removeFunc);
function onFunc(event:MouseEvent):void {
	var tar:String = "local";  // テスト用
	trace(tar, btn1.tar, this.tar);
	btn1.buttonMode = true;
}
function removeFunc(event:MouseEvent):void {
	trace("onFuncを消す");
	btn1.buttonMode = false;
	btn1.removeEventListener(MouseEvent.CLICK, onFunc);
}

参照さえ取っておけば、名前のない関数でもイベントリスナーから削除することはできます。けれども、名前のない関数特有のクセがあります。とくに関数内におけるthisが問題となります。ですから結論として、やはりお勧めはしません。
var tar:String = "timeline";
var referenceFunc:Function = onFunc("local")
btn1.tar = "instance";  // btn1がMovieClipの場合
btn1.addEventListener( MouseEvent.CLICK, referenceFunc);
btn2.addEventListener( MouseEvent.CLICK, removeFunc);
function onFunc(tar:String):Function{
	return function(event:MouseEvent):void{
		trace(tar, btn1.tar, this.tar);
		btn1.buttonMode = true;
	}
}
function removeFunc(event:MouseEvent):void{
	trace("onFuncを消す");
	btn1.buttonMode = false;
	btn1.removeEventListener(MouseEvent.CLICK, referenceFunc);
}

引用:
myantaさんは書きました:
なるほど、参照もなく、引数も渡せていなかったのですね…。

引数渡しする際は代わりにグローバル変数などに値を格納して
呼び出せるように回避してみようと思います…!


----------------
 

レイ
Åê¹ÆNo.43986
投稿日時: 2009-11-20 16:53
新米
居住地: 大阪
投稿: 11
使用環境:
winVista,FlashCS4,AS3,
IE8,FlashPlayer10,
Red5v8rec2ストリーミング配信
理解度がさらにUPしました、ありがとうございます!
野中様、詳細なご説明ありがとうございます!

以前に作成したもので、動作が?なものがあった気がします。
気づけてよかったです!

私がやろうとしていたことは、
ボタンをクリックしてurlへ飛ばすような
関数を作ったときに、引数でurlを渡してしまえば、
作成する関数もスッキリすると思っていました。

MovieClipのボタンを3つ置いて、
↓↓このような感じです。
あたりまえなのですが、リスナーを消せませんでした;
x x x x x x x x x x x x x x x x x x x x x x
//リンク設定 btn1.addEventListener(MouseEvent.CLICK, urlLinkFunc("http://●●●/")); 
btn2.addEventListener(MouseEvent.CLICK, urlLinkFunc("http://●●●/")); 
btn3.addEventListener(MouseEvent.CLICK, urlLinkFunc("http://●●●/")); 
function urlLinkFunc( tar:String){ 	
 return function ( event:MouseEvent){ 
 	navigateToURL( new URLRequest(tar),"_blank"); 	
 } 
}  

//他のボタンを押したら、リスナーを消す 
…略
btn1.removeEventListener(MouseEvent.CLICK, urlLinkFunc("http://●●●/")); 
btn2.removeEventListener(MouseEvent.CLICK, urlLinkFunc("http://●●●/")); 
btn3.removeEventListener(MouseEvent.CLICK, urlLinkFunc("http://●●●/"));
x x x x x x x x x x x x x x x x x x x x x x


野中様のご提示いただいたものを参考に、
新しく作り直そうと思います。

ありがとうございました!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops