actionscript-3 – 要在AS3中将参数传递给事件侦听器,简单的方法
预期/伪示例:
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从函数本身内部执行此操作。 在事件处理程序调用中哪个参数去了? 违反了一个完整的语义混乱。 它可以混合范围,但它是一个很近的一个。你必须小心,但是。 …其他许多建议的解决方法。 所有我想要的只是传递一个参数到事件处理程序,所以我可以使用它的功能,就像任何正常的功能! 我要求太多吗? 解决方法
开箱即用:只需要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这是最简单但最坚实的方法。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |