`
xuela_net
  • 浏览: 495889 次
文章分类
社区版块
存档分类
最新评论

Fixjs——显示交互基类InteractiveObject

 
阅读更多
<sdt id="89512093" sdtlocked="t" contentlocked="t" sdtgroup="t"></sdt>

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.csdn.net/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专栏

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics