`
Fis
  • 浏览: 87497 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

传参之事件代理

    博客分类:
  • AS
阅读更多
  通常情况下,我们使用事件机制时,编写的事件处理函数只需要一个参数event就可以了,但是有时,如果需要用到额外的数据, 又不想新建自定义事件类时,就可以用到这种支持参数的事件处理函数了,这种方式是在网上看到的,这里收集整理一下。其原理是利用函数的返回值返回一个带有基本事件类作参数的函数,用这个返回值作事件的处理函数,因为这个函数是在另一个函数中返回的,所以它在具备普通的事件处理函数的功能的前提下又可以扩展出我们想要的功能。下面是代码:
    function createParamHandler(handler:Function,... arg):Function {
       var flag:Boolean=false;
       var result:Function=function(event:*):void{
           var handlerParams:*=arg;//事件参数之外的额外参数
           if(!flag){
              flag=true;//确保只添加一次事件参数
              handlerParams.unshift(event);//添加事件参数
           }
           handler.apply(null,handlerParams);//在新的事件处理函数被调用时执行原函数
       }
       return result;//返回一个新的事件处理函数
    }
    var handler:Function = createParamHandle(mouseDownHandler,"param1","param2");
    stage.addEventListener(MouseEvent.MOUSE_DOWN, handler);
    function mouseDownHandler(event:MouseEvent,...arg) {//原函数
       trace(arg);
    }

  为了便于使用,做成一个类,调用静态方法完成新的处理函数的创建
package
{
        public class ParamsHandlerUtils
        {
                public function ParamsHandlerUtils()
                {
                }
                
                static function createParamsHandler(method:Function,...arg):Function {
                                var isAddEventParams:Boolean = false;
                                var result:Function = function(event:*){
                                                var params:* = arg;
                                                if(!isAddEventParams){
                                                        isAddEventParams = true;
                                                        params.unshift(event);
                                                }
                                                method.apply(null,params);
                                        }
                                return result;
                        }
                }
        }
}


使用:
var handler:Function = ParamsHandlerUtils.createParamHandle(mouseDownHandler,"param1","param2");
stage.addEventListener(MouseEvent.MOUSE_DOWN,handler);
function mouseDownHandler(e:MouseEvent,...arg) {
        trace(arg);
}


  感谢原作者,这里把原来的代码转一下:
function create(f:Function,... arg):Function {
    var F:Boolean=false;
   var _f:Function=function(e:*){
    var a:*=arg
      if(!F){
      F=true
      a.unshift(e)
    };
   f.apply(null,a);
    };
   return _f;
  }
stage.addEventListener(MouseEvent.MOUSE_DOWN,create(mouseDownHandler,"a","b"));
function mouseDownHandler(e:MouseEvent,...arg) {
  trace(arg);
}

分享到:
评论

相关推荐

    画面互相传值跳转

    通过上述代理方法,主画面可以监听到登录成功或失败的事件,并根据结果决定下一步的操作,如跳转到主应用界面或显示错误信息。 总的来说,代理协议是iOS开发中常用的数据传递和控制流工具,尤其适用于视图控制器...

    UI界面之间的值传递-思路2-微变化

    发送方设置接收方为自己的代理,当需要传递数据时,通过代理方法将值传递给接收方。这种方式灵活且易于理解,但可能导致过多的代理方法,增加代码复杂性。 NSNotification是Foundation框架提供的全局通知系统,允许...

    java web 面试

    **知识点2:jQuery bind绑定事件及传参** jQuery中使用`.bind()`方法可以绑定事件处理器到特定的事件类型上,同时可以通过函数参数的方式传递额外的信息。 示例代码: ```javascript $("#s1").bind("click", ...

    最新各大公司企业真实面试题-四川internet信息高速公路(C#)

    11. **设计老鼠、猫、人问题**:涉及到事件驱动编程和扩展性,可以通过事件监听和发布机制实现,猫叫触发事件,老鼠和人作为事件的监听者做出相应反应。 12. **对象关系持久化(ORM)**:ASP.NET中的ORM框架如...

    VUE经典面试题目包含答案

    43. **路由传参**:通过query和params传递,路由守卫包括全局前置守卫、全局后置守卫、组件内守卫。 44. **过滤器**:全局和局部过滤器,用于数据格式化。 45. **组件封装**:遵循单一职责原则,考虑可复用性和可...

    vue2 以及小程序面试题文档,帮助你快速了解,vue2框架以及小程序的核心

    2. 事件传值:通过事件绑定和传参实现。 3. WXSS与CSS区别:WXSS增加了微信特有的样式特性,如rpx单位、尺寸单位转换等。 4. 双向绑定与Vue的区别:小程序的双向绑定不直接支持对象属性,需借助data-set。 5. 小程序...

    面试题资源,涉及vue,js,node,html,css,webpack等等

    3. this指向:this总是指向函数的直接调用者,如果有new关键字,this指向new出来的对象,在事件中,this指向触发这个事件的对象。 4. 数组和对象的遍历:数组和对象可以使用for in、forEach、for-of等多种方式进行...

    Silverlight初学者的入门课程

    与第十六章类似,这一节进一步讲解了如何精确控制页面跳转,包括传参和状态管理等高级特性。 #### 第十八章:在Silverlight布局控件 Silverlight提供了多种布局控件,如Canvas、StackPanel和Grid,用于组织和定位...

    python爬虫面试题.pdf

    - **GET:** 用于请求访问已经被URI识别的资源,可以通过URL传参,安全性较低,适合获取数据。 - **POST:** 用于向指定资源提交数据,进行修改查询,通常用于需要用户填写表单的网页数据提交,安全性较高,适合...

    java经典面试2010集锦100题(不看你后悔)

    B) 重载方法的参数必须有不同之处。 C) 重载方法的名字必须相同,否则就不能称为重载了。 D) 重载方法的返回类型相不相同都可以。 题目23:d 程序如下: class A { static int count=0; int number=0; A() { ...

Global site tag (gtag.js) - Google Analytics