加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

actionscript-3 – 要在AS3中将参数传递给事件侦听器,简单的方法

发布时间:2020-12-15 19:49:46 所属栏目:百科 来源:网络整理
导读:预期/伪示例: stage.addEventListener(MouseEvent.CLICK,onClick.someWayToPassParameters(true,123,4.56,"string"));function onClick(e:MouseEvent):void { trace("Received " + someWayToRetrieveParameters().b/i/n/s + ".");} 多年(3?4),在每个网站,
预期/伪示例:

stage.addEventListener(MouseEvent.CLICK,onClick.someWayToPassParameters(true,123,4.56,"string"));
function onClick(e:MouseEvent):void {
    trace("Received " + someWayToRetrieveParameters().b/i/n/s + ".");
}

多年(3?4),在每个网站,论坛,博客,无论我在哪里搜索,人们告诉我没有简单的方法来做到这一点。他们通常建议:

>将侦听器添加到动态对象,您可以在该对象中将值设置为额外的属性,并在该函数中引用它(e.target.property / e.currentTarget.property)。

并非所有类都是动态的。例如,它不会在Sprite上工作。
>使用自定义类扩展对象的类以添加属性或仅使其动态化。

你必须每次创建一个全新的调整类。
>使用匿名函数作为事件处理程序。

没有参考(这是丑的)。要删除监听器以释放资源,您将无法使用arguments.callee从函数本身内部执行此操作。
>在事件处理程序内调用另一个函数,使用参数。

在事件处理程序调用中哪个参数去了?
>将事件处理程序保持在与参数相同的范围内。

违反了一个完整的语义混乱。
>在接收目标和参数的函数中封装事件处理程序定义和addEventListener调用。

它可以混合范围,但它是一个很近的一个。你必须小心,但是。

…其他许多建议的解决方法。

所有我想要的只是传递一个参数到事件处理程序,所以我可以使用它的功能,就像任何正常的功能!

我要求太多吗?

解决方法

开箱即用:只需要2条优雅的代码来解决这个古老的难题。

stage.addEventListener(MouseEvent.CLICK,onClick(true,"string"));
function onClick(b:Boolean,i:int,n:Number,s:String):Function {
  return function(e:MouseEvent):void {
    trace("Received " + b + "," + i + "," + n + " and " + s + ".");
  };
}

但最重要的是,您很可能需要在以后删除该监听器以释放资源,因此1行将其存储在变量中:

var functionOnClick:Function = onClick(true,"string");
stage.addEventListener(MouseEvent.CLICK,functionOnClick);
function onClick(b:Boolean," + n + " and " + s + ".");
  };
}

你可以正常删除它:

trace("Before: " + stage.hasEventListener(MouseEvent.CLICK));
stage.removeEventListener(MouseEvent.CLICK,functionOnClick);
trace("After: " + stage.hasEventListener(MouseEvent.CLICK));

这是一个更详细的动态示例来证明它的用途:

function onClick(s:String):Function {
  return function(e:MouseEvent):void {
    trace("The square " + s + " at x = " + e.currentTarget.x + "px was clicked");
  };
}
var myFunctions:Array = new Array();
for (var i:int = 0; i < 10; i++) {
  myFunctions.push(onClick("#" + (i+1)));
}
for (i = 0; i < myFunctions.length; i++) {
  var square:Sprite = new Sprite();
  square.name = "sqr" + i;
  square.addChild(new Bitmap(new BitmapData(20,20,false,0)));
  square.x = 5 + 25 * i;
  square.addEventListener(MouseEvent.CLICK,myFunctions[i]);
  stage.addChild(square);
}

没有属性通过动态对象,没有自定义类,没有松散的功能,没有范围重叠。正是什么逻辑期望它是:你只是传递参数。

要正确地删除每个听众,你可以稍后这样做:

for (i = 0; i < myFunctions.length; i++) {
  square = stage.getChildByName("sqr" + i) as Sprite;
  trace("Before (#" + (i+1) + "): " + square.hasEventListener(MouseEvent.CLICK));
  square.removeEventListener(MouseEvent.CLICK,myFunctions[i]);
  trace("After (#" + (i+1) + "): " + square.hasEventListener(MouseEvent.CLICK));
  stage.removeChild(square);
}

IMHO这是最简单但最坚实的方法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读