将参数传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 addEventListener AS3

以简单的方式将参数传递给 AS3 中的事件侦听器......它存在吗?

带有参数的JavaScript addEventListener函数[重复]

Python:如何将参数传递给线程作业(回调)

将参数传递给函数

将数组作为参数传递给 C 中的函数