Ext事件

添加和删除事件

使用addEvent可以添加事件,简写on。

使用removeEvent删除事件,简写un。

使用purgeListeners()移除所有事件。

 

代码示例:

var fn = function() {

        // TODO

    };

    //unremoveEvent的简写。用于移除一个事件。

    p.on("walk",fn); // 添加一个事件。

    p.un("walk",fn); // 删除一个事件。

    p.purgeListeners();  // 删除所有的事件。

 

浏览器事件

浏览器事件即传统意义上的鼠标单击、移动等事件,Ext通过Ext.EventManager、Ext.EventObject、Ext.lib.Event对原生浏览器事件进行了封装。

也许有人会问,HTML元素本身已经支持浏览器事件,为什么还要重新设计一套事件机制呢?基本上所有的框架都会实现自己的时间机制。最要的原因就是:HTML元素处理时间是通过单一的时间绑定实现的。也就是说,如果不进行封装,一个事件只能绑定到一个事件处理句柄。

例如:

原生:

 

// 原生事件

    var or = document.getElementById("originalEvent");

    or.onclick = function() {

        alert("event hander1");

    };

    or.onclick = function() {

        alert("event hander2");

    };

Onclick事件绑定2个事件处理句柄,最终运行会发现只会弹出event hander2,因为第一个已经被第二个覆盖掉了。但是如果使用Ext就不存在这样的问题。

 

Ext:

 

// Ext事件

    var o = Ext.get("extEvent");

    o.on("click",function() {

        alert("event hander1" + new Date());

    });

    o.on("click",function(){

        alert("event hander2" + new Date());

    });

 

 

Ext.lib.Event

Ext.lib.Event是定义在adpater中的工具类,封装了不同浏览器的事件处理函数,为上层组件提供统一的功能接口。
 

主要的函数:

getX()、getY()、getXY():获取事件发生的坐标。getXY()返回一个数组,getXY()[0]代表X坐标,getXY()[1]代表Y坐标。

 

getTarget:返回事件的目标元素,统一IE和其他浏览器的ev.target和ev.srcElement。

 

on和un:on将事件监听函数绑定到元素对应的事件上;un与on的作用相反。

 

purgeElement:将元素上的所有事件都清除。

 

PreventDefault:取消浏览器对当前事件的默认操作。如我们自定义右键菜单时就需要用到这个函数,防止弹出浏览器默认的右键菜单。

 

StopPropagation:阻止事件传递。内层元素触发的事件会传递给外层元素,调用这个函数阻止将事件传递给外层。

 

OnAvailable:3个参数,id,fn,scope。等到id对应的元素可用时才调用fn,scope是调用函数的作用域。

 

 

Ext.util.Observable

位于Ext组件的顶端,提供处理事件的基本功能。要实现一个可以处理事件的基本组件,最简单的做法就是集成Ext.util.Observable。

 

当使用addListenner/on处理注册事件时,可以使用复合式参数。如:

 

// 注册事件时可以使用复合式参数。

    Ext.get("comEvt").on("click",function() { // 事件处理函数

        alert("复合式参数");

    },this,{

        single:true,//只执行一次

        delay:1000 // 1S后调用事件处理函数。

    });

This:调用函数的作用域。

上面的代码,运行后单击按钮,1S后弹出“复合式参数”,再单击就什么也不发生了。

 

 

使用on一次定义多个事件监听器。

 

// 一次定义多个事件监听器。

    var tme = Ext.get('tme');

    tme.on({

        'click':{

            fn:function() {

                Ext.Msg.show({

                   title:'Message',

                   msg: 'Text Value:' + this.value,

                   buttons: Ext.Msg.OK,

                   fn: function(){},

                   animEl: 'body',

                   icon: Ext.MessageBox.INFO

                });

 

 

            }

        },

        'mouseover':{

            fn:function() {

                this.style.fontSize = 15;

                this.style.color = "#FFFFFF";

            }

        },

        mouseout:{

            fn:function() {

                this.style.fontSize = 15;

                this.style.color = "#FF0000";

            }

        }

    });

 

 

为某个事件设置拦截器

 

var interceptor = Ext.get('interceptor');

    interceptor.on('click',function() {

        Ext.util.Observable.capture(p, function() {

            alert("拦截Person的所有事件");

            returntrue;

        }, this);

    });

最开始的代码中,我们实现了一个类Person,它有3个事件walk,eat,sleep

这里用Ext.util.Observable.capture来捕捉Person的所有事件。

运行后,打你家interceptor按钮,再分别单击walk,eat,sleep按钮,会先弹出“拦截Person的所有事件”,然后提示各个动作具体的信息。

上面的代码并没有阻止事件的执行,如果要阻止事件的执行,可以这样。

 

// 一个用户名输入框,输入的用户名赋给Personname。如果用户名为空,则提示输入,并阻止事件往后执行

    Ext.get('interceptor2').on('click',function() {

        var tm = Ext.get('name').getValue();

        Ext.util.Observable.capture(p, function() {

            if (tm === '' || tm === 'undefind') {

                Ext.Msg.show({

                    title:"提示",

                    msg:"请输入名字!",

                    buttons:Ext.Msg.OK,

                    animEl:'body',

                    icon:Ext.MessageBox.WARNING

                });

                returnfalse;

            }

            p.name =  tm;

            returntrue;

        }, this);

       

    });

 

Ext.util.Observable.releaseCapture:一次性清除fireEvent上所有的拦截器。

如果只想一次设置来暂停某个对象上所有事件的发生,可以使用suspendEvents()函数。

 

// 暂停某个对象上所有事件的发生

    Ext.get("supsendEvent").on("click",function() {

        p.suspendEvents(); //暂停Person对象上所有事件的发生。

        Ext.MessageBox.show({

            title:"提示",

            msg:"已暂停Person对象上所有事件的发生!",

            buttons:Ext.Msg.OK,

            animEl:"body",

            icon:Ext.MessageBox.INFO

        });

    });

在调用suspendEvents()后,Person对象上所有的事件都会失效。要向恢复,需要调用resumeEvents()。

 

// 恢复某个对象上的所有事件的发生。

    Ext.get("resumeEvents").on("click",function() {

        p.resumeEvents();

        Ext.MessageBox.show({

            title:"提示",

            msg:"已恢复Person对象上所有事件的发生!",

            buttons:Ext.Msg.OK,

            animEl:"body",

            icon:Ext.MessageBox.INFO

        });

    });

 

 

Ext.EventManager

作为事件管理器,Ext.EventManager提供了一系列相关处理事件的方法。最常用的是:onDocumentReady()、onWindowResize()、onTextResize()。

 

onDocumentReady():就是Ext.onReady(),在文档渲染完毕,图片等未下载时调用。无论在任何时候,都需要保证脚本在HTML元素加载完毕后执行,这样可以避免很多潜在的问题。

 

OnWindowResize():作用就是监听浏览器窗口大小的改变,它会提醒我们浏览器窗口的大小在何时改变,改变后的值是多少。

 

// onWindowResize():监听浏览器窗口大小的改变,并返回改变的大小。

    // 因为它监听的是浏览器窗口,在浏览器打开时就已经存在,因此不需要写在Ext.onReady()里面

    Ext.EventManager.onWindowResize(function(width,height) {

        Ext.MessageBox.show({

            title:"提示",

            msg:"改变后的窗口的大小:width("+width+"),height("+height+")",

            buttons:Ext.Msg.OK,

            animEl:'body',

            icon:Ext.MessageBox.OK

        });

    });

 

onTextResize():监听用户修改浏览器文字的大小。

 

// onTextResize():监听用户修改的浏览器文字大小。

    Ext.EventManager.onTextResize(function(oldSize,newSize) {

        Ext.MessageBox.show({

            title:"提示",

            msg:"改变前字体的大小:" + oldSize +",改变后文字的大小:" + newSize,

            buttons:Ext.Msg.OK,

            animEl:'body',

            icon:Ext.MessageBox.OK

        });

    });

 

 

Ext.EventObject

Ext.EventObject是对事件的封装,它将Ext自定义事件与浏览器事件结合到一起使用。

Ext.EventObject定义了一系列的功能按键,这样就不用去记ASCII码了。

 

// 按下按键时判断是否是空格,是空格提示

    Ext.get("evtObjText").on("keypress",function(e) {

        if (e.getCharCode() == Ext.EventObject.SPACE) {

            Ext.Msg.alert("提示","用户名不能有空格");

            returnfalse;

        }

    });

 

Ext.EventObject是对原始事件的封装,如果要得到原始事件,调用Ext.EventObject.browserEvent。不过,这是未经任何加工的原生事件,各个浏览器表现不同,因此还是建议使用Ext.EventObject。

 

Ext.EventObject提供的另一个有趣的功能是getWheelDelta(),获取鼠标滚轮的Delta值。下面的例子监听mousewheel事件,动态改变div的宽度。

 

// 滚动鼠标滚轮,动态改变DIV的宽和高。

    Ext.get(document.body).on("mousewheel",function(e) {

        var delta = e.getWheelDelta();

        var div = Ext.get("wheelDeltaDiv");

        var width = delta*100 + div.getWidth();

        var height = delta*100 + div.getHeight();

        div.setWidth(width,true);

        div.setHeight(height,true);

    });

你可能感兴趣的:(Front,End)