Fixjs——显示交互基类InteractiveObject

本文深入介绍了Fixjs框架中的交互对象InteractiveObject类,详细阐述了如何通过DOM事件处理鼠标、键盘以及其他用户输入设备的交互事件,并展示了如何在Fixjs中实现点击、双击、鼠标移动等常见鼠标事件。此外,文章还提供了InteractiveObject类的完整代码,包括事件监听、事件派发以及鼠标事件类MouseEvent的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fixjs介绍

Fixjs是我打算在javascript技术领域开始积累的一个框架项目,这套框架主要为开发复杂组件提供底层的框架支持。

框架的类与接口我会尽量参考flash框架的实现。同时,我也会开放Fixjs的源代码,欢迎同仁一起学习、交流。

 

InteractiveObject

InteractiveObject 类是用户可以使用鼠标、键盘或其他用户输入设备与之交互的所有显示对象的抽象基类。随着移动设备的普及,还应该支持触摸的交互,这个留待日后完善。

实现InteractiveObject主要就是处理鼠标、键盘等交互事件,在Fixjs中,我是这样处理的:通过注册DOM元素的事件,然后再派发Fixjs的事件,说的直接些就是在DOM元素事件上面包了一层。

例如:实现“click”事件

重新addEventListener方法

    addEventListener: function(type, func) {

        switch (type) {

           case fixjs.events.MouseEvent.CLICK:

               $(this.ele).off("click", this._onDOMMouseEvent);

               $(this.ele).on("click", this._onDOMMouseEvent);

               break;

        }

        fixjs.display.InteractiveObject.base.addEventListener.call(this, type, func);

    }

DOM事件处理_onDOMMouseEvent中,会重新派发fixjs.events.MouseEvent.CLICK事件

    _onDOMMouseEvent:function (event) {

        if (event.target!= event.currentTarget)

           return;

 

        var obj = event.target.fixjsObj;

        if (!obj.mouseEnabled)

           return;

        var type = fixjs.events.MouseEvent.CLICK;

        var e = new fixjs.events.MouseEvent(type);

        e.altKey = event.altKey;

        e.buttonDown = event.buttons >0;

        e.ctrlKey = event.ctrlKey;

        e.localX = event.offsetX;

        e.localY = event.offsetY;

        if (event.relatedTarget)

           e.relatedObject = event.relatedTarget.fixjsObj;

        e.shiftKey = event.shiftKey;

        e.stageX = event.pageX;

        e.stageY = event.pageY;

 

        obj.dispatchEvent(e);

        if (e.isDefaultPrevented())

           event.preventDefault();

    }

MouseEvent

定义鼠标事件类,继承于Event

fixjs.events.MouseEvent = fixjs.events.Event.extend({

    init: function (type){

        fixjs.events.MouseEvent.base.init.call(this, type);

        this.altKey = false;

        this.buttonDown = false;

        this.ctrlKey = false;

        this.delta = 0;

        this.localX = 0;

        this.localY = 0;

        this.relatedObject = null;

        this.shiftKey = false;

        this.stageX = 0;

        this.stageY = 0;

    },

    disposing:function () {

        this.relatedObject = null;

        fixjs.events.MouseEvent.base.disposing.call(this);

    },

    clone:function () {

        var e = new fixjs.MouseEvent(this.type);

        e.altKey = this.altKey;

        e.buttonDown = this.buttonDown;

        e.ctrlKey = this.ctrlKey;

        e.delta = this.delta;

        e.localX = this.localX;

        e.localY = this.localY;

        e.relatedObject = this.relatedObject;

        e.shiftKey = this.shiftKey;

        e.stageX = this.stageX;

        e.stageY = this.stageY;

        return e;

    },

    toString: function (){

        return "[fixjs.events.MouseEvent]"+ this.type;

    }

});

定义鼠标事件常量。

fixjs.events.MouseEvent.CLICK = "click";

fixjs.events.MouseEvent.DOUBLE_CLICK = "doubleClick";

fixjs.events.MouseEvent.MIDDLE_CLICK = "middleClick";

fixjs.events.MouseEvent.MIDDLE_MOUSE_DOWN = "middleMouseDown";

fixjs.events.MouseEvent.MIDDLE_MOUSE_UP = "middleMouseUp";

fixjs.events.MouseEvent.MOUSE_DOWN = "mouseDown";

fixjs.events.MouseEvent.MOUSE_MOVE = "mouseMove";

fixjs.events.MouseEvent.MOUSE_OUT = "mouseOut";

fixjs.events.MouseEvent.MOUSE_OVER = "mouseOver";

fixjs.events.MouseEvent.MOUSE_UP = "mouseUp";

fixjs.events.MouseEvent.MOUSE_WHEEL = "mouseWheel";

fixjs.events.MouseEvent.RIGHT_CLICK = "rightClick";//与右键菜单冲突,暂时不支持

fixjs.events.MouseEvent.RIGHT_MOUSE_DOWN = "rightMouseDown";

fixjs.events.MouseEvent.RIGHT_MOUSE_UP = "rightMouseUp";

 

 

InteractiveObject的完整代码

fixjs.display.InteractiveObject = fixjs.display.DisplayObject.extend({

    init: function (ele) {

        fixjs.display.InteractiveObject.base.init.call(this, ele);

        this.mouseEnabled = true;

        this.tabEnabled = false; //to do...

        this.tabIndex = -1; //to do...

    },

    disposing:function () {

 

        fixjs.display.InteractiveObject.base.disposing.call(this);

    },

    addEventListener: function(type, func) {

        switch (type) {

           case fixjs.events.MouseEvent.CLICK:

           case fixjs.events.MouseEvent.MIDDLE_CLICK:

           case fixjs.events.MouseEvent.RIGHT_CLICK:

               $(this.ele).off("click", this._onDOMMouseEvent);

               $(this.ele).on("click", this._onDOMMouseEvent);

               break;

           case fixjs.events.MouseEvent.DOUBLE_CLICK:

               $(this.ele).off("dblclick", this._onDOMMouseEvent);

               $(this.ele).on("dblclick", this._onDOMMouseEvent);

               break;

           case fixjs.events.MouseEvent.MOUSE_DOWN:

           case fixjs.events.MouseEvent.MIDDLE_MOUSE_DOWN:

           case fixjs.events.MouseEvent.RIGHT_MOUSE_DOWN:

               $(this.ele).off("mousedown", this._onDOMMouseEvent);

               $(this.ele).on("mousedown", this._onDOMMouseEvent);

               break;

           case fixjs.events.MouseEvent.MOUSE_MOVE:

               $(this.ele).off("mousemove", this._onDOMMouseEvent);

               $(this.ele).on("mousemove", this._onDOMMouseEvent);

               break;

           case fixjs.events.MouseEvent.MOUSE_OUT:

               $(this.ele).off("mouseout", this._onDOMMouseEvent);

               $(this.ele).on("mouseout", this._onDOMMouseEvent);

               break;

           case fixjs.events.MouseEvent.MOUSE_OVER:

               $(this.ele).off("mouseover", this._onDOMMouseEvent);

               $(this.ele).on("mouseover", this._onDOMMouseEvent);

               break;

           case fixjs.events.MouseEvent.MOUSE_UP:

           case fixjs.events.MouseEvent.MIDDLE_MOUSE_UP:

           case fixjs.events.MouseEvent.RIGHT_MOUSE_UP:

               $(this.ele).off("mouseup", this._onDOMMouseEvent);

               $(this.ele).on("mouseup", this._onDOMMouseEvent);

               break;

           case fixjs.events.MouseEvent.MOUSE_WHEEL:

               $(this.ele).off("mousewheel ", this._onDOMMouseEvent);

               $(this.ele).on("mousewheel", this._onDOMMouseEvent);

               break;

           case fixjs.events.KeyboardEvent.KEY_DOWN:

               $(this.ele).off("keydown ", this._onDOMKeyboardEvent);

               $(this.ele).on("keydown", this._onDOMKeyboardEvent);

               break;

           case fixjs.events.KeyboardEvent.KEY_UP:

               $(this.ele).off("keyup ", this._onDOMKeyboardEvent);

               $(this.ele).on("keyup", this._onDOMKeyboardEvent);

               break;

           case fixjs.events.FocusEvent.FOCUS_IN:

               $(this.ele).off("focusin", this._onDOMFocusEvent);

               $(this.ele).on("focusin", this._onDOMFocusEvent);

               break;

           case fixjs.events.FocusEvent.FOCUS_OUT:

               $(this.ele).off("focusout", this._onDOMFocusEvent);

               $(this.ele).on("focusout", this._onDOMFocusEvent);

               break;

        }

        fixjs.display.InteractiveObject.base.addEventListener.call(this, type, func);

    },

    _onDOMMouseEvent:function (event) {

        if (event.target!= event.currentTarget)

           return;

        var obj = event.target.fixjsObj;

        if (!obj.mouseEnabled)

           return;

        var type;

        switch (event.type){

           case "click":

               switch (event.button) {

                   case 0:

                       type = fixjs.events.MouseEvent.CLICK;

                       break;

                   case 1:

                       type = fixjs.events.MouseEvent.MIDDLE_CLICK;

                       break;

                   case 2:

                       type = fixjs.events.MouseEvent.RIGHT_CLICK;

                       break;

               }

               break;

           case "dblclick":

               type = fixjs.events.MouseEvent.DOUBLE_CLICK;

               break;

           case "mousedown":

               switch (event.button) {

                   case 0:

                       type = fixjs.events.MouseEvent.MOUSE_DOWN;

                       break;

                   case 1:

                       type = fixjs.events.MouseEvent.MIDDLE_MOUSE_DOWN;

                       break;

                   case 2:

                       type = fixjs.events.MouseEvent.RIGHT_MOUSE_DOWN;

                       break;

               }

               break;

           case "mousemove":

               type = fixjs.events.MouseEvent.MOUSE_MOVE;

               break;

           case "mouseout":

               type = fixjs.events.MouseEvent.MOUSE_OUT;

               break;

           case "mouseover":

               type = fixjs.events.MouseEvent.MOUSE_OVER;

               break;

           case "mouseup":

               switch (event.button) {

                   case 0:

                       type = fixjs.events.MouseEvent.MOUSE_UP;

                       break;

                   case 1:

                       type = fixjs.events.MouseEvent.MIDDLE_MOUSE_UP;

                       break;

                   case 2:

                       type = fixjs.events.MouseEvent.RIGHT_MOUSE_UP;

                       break;

               }

               break;

           case "mousewheel":

               type = fixjs.events.MouseEvent.MOUSE_WHEEL;

               break;

        }

        var e = new fixjs.events.MouseEvent(type);

        e.altKey = event.altKey;

        e.buttonDown = event.buttons >0;

        e.ctrlKey = event.ctrlKey;

        e.localX = event.offsetX;

        e.localY = event.offsetY;

        if (event.relatedTarget)

           e.relatedObject = event.relatedTarget.fixjsObj;

        e.shiftKey = event.shiftKey;

        e.stageX = event.pageX;

        e.stageY = event.pageY;

        if (e.type== fixjs.events.MouseEvent.MOUSE_WHEEL)

           e.delta = event.originalEvent.wheelDelta;

        obj.dispatchEvent(e);

        if (e.isDefaultPrevented())

           event.preventDefault();

    },

    _onDOMKeyboardEvent:function (event) {

        if (event.target != event.currentTarget)

           return;

        var obj = event.target.fixjsObj;

        var type;

        switch (event.type){

           case "keydown":

               type = fixjs.events.KeyboardEvent.KEY_DOWN;

               break;

           case "keyup":

               type = fixjs.events.KeyboardEvent.KEY_UP;

               break;

        }

        var e = new fixjs.events.KeyboardEvent(type);

        e.altKey = event.altKey;

        e.ctrlKey = event.ctrlKey;

        e.keyCode = event.keyCode;

        e.shiftKey = event.shiftKey;

        obj.dispatchEvent(e);

        if (e.isDefaultPrevented())

           event.preventDefault();

    },

    _onDOMFocusEvent:function (event) {

        if (event.target!= event.currentTarget)

           return;

        var obj = event.target.fixjsObj;

        var type;

        switch (event.type){

           case "focusin":

               type = fixjs.events.FocusEvent.FOCUS_IN;

               break;

           case "focusout":

               type = fixjs.events.FocusEvent.FOCUS_OUT;

               break;

        }

        var e = new fixjs.events.FocusEvent(type);

        if (event.relatedTarget)

           e.relatedObject = event.relatedTarget.fixjsObj;

        e.shiftKey = event.shiftKey;

        obj.dispatchEvent(e);

        if (e.isDefaultPrevented())

           event.preventDefault();

    }

});

 

Fixjs_0.2.0源码下载

 

下载地址:http://download.youkuaiyun.com/detail/hunkcai/5469395

 

Fixjs_0.2.0已实现的内容:

【基础方法,基础类】

trace():页面调试输出

fixjs.Class:类定义

fixjs.Object:提供对象初始化,释放控制,克隆接口

fixjs.DisposeUtil:释放资源工具类

fixjs.CloneUtil:克隆资源工具类

fixjs.Map:哈希数据结构

 

【事件处理】

fixjs.events.Event:事件类

fixjs.events.EventDispatcher:事件派发类

fixjs.events.MouseEvent:鼠标事件类

fixjs.events.KeyboardEvent:键盘事件类

fixjs.events.FocusEvent:焦点事件类

 

【几何数据结构】

fixjs.geom.Point

fixjs.geom.Rectangle

 

【显示类】

fixjs.display.DisplayObject

fixjs.display.InteractiveObject

 

 

相关文章

Fixjs专栏

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值