Fixjs——事件回调的this

本文详细介绍了在使用Fixjs框架时遇到的this问题,包括事件回调上下文不一致的原理,以及如何通过传入回调函数的this对象来解决这一问题。文中还提供了修正后的代码示例。

Fixjs介绍

Fixjs是一款javascript界面基础框架,主要为开发复杂组件提供底层的框架支持。

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

事件回调的this问题

javascript中,函数调用的时候,this指向调用的对象,这个特性会造成代码上下文的不一致。请看一下代码片段:

hui.layout.MovableExtension实例中向this._target注册一个mousedown事件,回调时调用hui.layout.MovableExtension实例的mouseDownHandler处理函数

hui.layout.MovableExtension = fixjs.Object.extend({

init: function(target) {

this._target = target;

//

this.stagePoint = new fixjs.geom.Point(0, 0);

//

this._target.addEventListener(fixjs.events.MouseEvent.MOUSE_DOWN, this._mouseDownHandler);

},

_mouseDownHandler:function (event) {

if (event.currentTarget!= this._target || event.type != fixjs.events.MouseEvent.MOUSE_DOWN)

return;

//以下代码将报错,因为this并不指向当前的hui.layout.MovableExtension实例

this.stagePoint.x = event.stageX;

this.stagePoint.y = event.stageY;

//

现在的问题是,mouseDownHandler中的this并不指向当前hui.layout.MovableExtension实例,这导致事件注册和事件处理的上下文不一致,对代码的编写造成困扰。

修正事件回调的this

Javascript函数提供了callapplly方法,能够重新设定函数调用的this。如果在注册事件的时候,传入回调时的this对象,在派发事件时调用call设置this对象,上下文不一致的问题就解决了。

因此,fixjs.events.EventDispatcher的注册和事件派发要做一些调整:

注册事件时addEventListener新增caller参数,由外部传入函数回调的this对象;派发事件时调用函数的calll方法并传入caller

fixjs.events.EventDispatcher = fixjs.Object.extend({

//

addEventListener: function(type, func, caller){

if (!this._isFunction(func)){

return;

}

var list = this._events.get(type);

if (!list) {

list = [];

this._events.set(type, list);

}

var item = { func: func,caller: caller };

if (!item.caller)

item.caller = this; //caller为空时将指向当前的fixjs.events.EventDispatcher实例

list.push(item);

},

dispatchEvent: function(event) {

if (!(event instanceof fixjs.events.Event))

return;

var list = this._events.get(event.type);

if (!list || !list.length) {

return;

}

if (!event.target){

event.target = this;

if (this._target)

event.target = this._target;

}

event.currentTarget = this;

if (this._target)

event.currentTarget = this._target;

var buffer = list.slice(0);

while (buffer.length){

varitem = buffer.splice(0, 1)[0];

if (list.indexOf(item) >= 0) {

item.func.call(item.caller,event); //调用函数的call并传入caller

}

}

}

});

经过上述调整后,事件回调的上下文能够自行控制了,以下是修正后的hui.layout.MovableExtension代码:

hui.layout.MovableExtension = fixjs.Object.extend({

init: function(target) {

this._target = target;

//

this.stagePoint = new fixjs.geom.Point(0, 0);

//

this._target.addEventListener(fixjs.events.MouseEvent.MOUSE_DOWN,this._mouseDownHandler,this); //传入当前的hui.layout.MovableExtension实例this

},

_mouseDownHandler:function (event) {

if (event.currentTarget!= this._target || event.type != fixjs.events.MouseEvent.MOUSE_DOWN)

return;

// this指向当前的hui.layout.MovableExtension实例

this.stagePoint.x = event.stageX;

this.stagePoint.y = event.stageY;

//

注册事件时传入多一个参数this

相关文章

Fixjs专栏

内容概要:本文介绍了一个关于超声谐波成像中幅度调制聚焦超声所引起全场位移和应变的分析模型,并提供了基于Matlab的代码实现。该模型旨在精确模拟和分析在超声谐波成像过程中,由于幅度调制聚焦超声作用于生物组织时产生的力学效应,包括全场的位移与应变分布,从而为医学成像和治疗提供理论支持和技术超声谐波成像中幅度调制聚焦超声引起的全场位移和应变的分析模型(Matlab代码实现)手段。文中详细阐述了模型构建的物理基础、数学推导过程以及Matlab仿真流程,具有较强的理论深度与工程应用价值。; 适合人群:具备一定声学、生物医学工程或力学背景,熟悉Matlab编程,从事医学成像、超声技术或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于超声弹性成像中的力学建模与仿真分析;②支持高强度聚焦超声(HIFU)治疗中的组织响应预测;③作为教学案例帮助理解超声与组织相互作用的物理机制;④为相关科研项目提供可复用的Matlab代码框架。; 阅读建议:建议读者结合超声物理和连续介质力学基础知识进行学习,重点关注模型假设、偏微分方程的数值求解方法及Matlab实现细节,建议动手运行并修改代码以加深理解,同时可拓展应用于其他超声成像或治疗场景的仿真研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值