将参数传递给 addEventListener AS3
Posted
技术标签:
【中文标题】将参数传递给 addEventListener AS3【英文标题】:passing parameters to addEventListener AS3 【发布时间】:2012-09-04 11:37:20 【问题描述】:我正在努力将参数传递给 onComplete 事件处理程序。
看来我的问题出在事件上。完整的代码..
我只想从 url 加载图像并传输参数。
这是我的代码:
var imageURLRequest:URLRequest = new URLRequest(pic);
var myImageLoader:Loader = new Loader();
myImageLoader.load(imageURLRequest);
myImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(evt:Event.COMPLETE)
doIt(evt, "Shift key was down:")
,false,0, true);
function doIt(evt:Event, msg:String)
var myBitmapData:BitmapData = new BitmapData(myImageLoader.width, myImageLoader.height);
myBitmapData.draw(myImageLoader);
var myBitmap:Bitmap = new Bitmap;
myBitmap.bitmapData = myBitmapData;
非常感谢。
【问题讨论】:
他并没有真正在他的处理程序中听Event
。
【参考方案1】:
从处理程序内部函数中删除.COMPLETE
,以便您的侦听器如下所示:
myImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(evt:Event)
doIt(evt, "Shift key was down:")
, false, 0, true);
【讨论】:
尝试删除那个监听器(从闭包外部),你不能。这可能会导致内存泄漏,所以我建议永远不要使用它。只需在本地存储您需要的数据或查看 event.target 或 event.currentarget(来自普通事件处理程序)可以为您提供什么。 我同意你的观点,但在这种情况下,关闭后你不需要那个监听器。他也只是想知道为什么它不起作用。尽管我也建议 Jevgenij 的答案以获得更好的整体结果和实践。这就是我投赞成票的原因。编辑:他也在这里使用弱引用,所以这应该不是问题。【参考方案2】:将Loader
类视为加载程序,而不是DisplayObject
,即使它是:
var myBitmap:Bitmap;
var contentLoader:Loader = new Loader();
contentLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleComplete);
contentLoader.load(imageURLRequest);
function handleComplete(e:Event):void
myBitmap = contentLoader.content as Bitmap;
【讨论】:
【参考方案3】:首先,正如Gio 所说,从evt:Event.COMPLETE
中删除.COMPLETE
,因为它返回的是字符串而不是函数需要的事件。
然后,与其在addEventListener()
中将最后一个不可预测的参数(useWeakReference
)设置为true
,我建议您将引用保存在变量中以便在正确的时间使用removeEventListener()
。一种方法(在回答您的问题时)是:
var imageURLRequest:URLRequest = new URLRequest(pic);
var myImageLoader:Loader = new Loader();
myImageLoader.load(imageURLRequest);
var functionDoIt:Function = doIt("Shift key was down:");
myImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, functionDoIt);
function doIt(msg:String):Function
return function(evt:Event):void
// Now you can use both "msg" and "evt" here
var myBitmapData:BitmapData = new BitmapData(myImageLoader.width, myImageLoader.height);
myBitmapData.draw(myImageLoader);
var myBitmap:Bitmap = new Bitmap(myBitmapData);
// Remove the listener when you don't need it anymore:
//myImageLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, functionDoIt);
阅读this answer,您可以更好地理解这个解决方案。
【讨论】:
以上是关于将参数传递给 addEventListener AS3的主要内容,如果未能解决你的问题,请参考以下文章
以简单的方式将参数传递给 AS3 中的事件侦听器......它存在吗?