在 Javascript 中访问事件处理程序中的类成员变量

Posted

技术标签:

【中文标题】在 Javascript 中访问事件处理程序中的类成员变量【英文标题】:Accessing class member variables inside an event handler in Javascript 【发布时间】:2011-03-05 19:07:39 【问题描述】:

我有一个关于从类使用的事件处理程序内部访问 javascript 类成员变量的正确方法的快速问题。例如:

function Map() 
    this.x = 0;
    this.y = 0;

    $("body").mousemove( function(event) 
        this.x = event.pageX;     // Is not able to access Map's member variable "x"
        this.y = event.pageY;     // Is not able to access Map's member variable "y"
    );

事件处理程序中的“this.x”并没有改变“Map”类的成员变量,而是试图影响触发事件的元素的“x”成员变量。从事件处理程序中访问“Map”类的成员变量的正确方法是什么?

任何帮助将不胜感激 - 我一直在摸索这个问题。

干杯, 查理

【问题讨论】:

【参考方案1】:

由于this 在事件上下文中发生变化(通常指向global),您需要在事件之外存储对您自己的引用:

function Map() 
    this.x = 0;
    this.y = 0;
    var _self = this;
    $("body").mousemove( function(event) 
        _self.x = event.pageX;     // Is now able to access Map's member variable "x"
        _self.y = event.pageY;     // Is now able to access Map's member variable "y"
    );

【讨论】:

事件处理程序上的this 值通常指向绑定处理程序的DOM 元素,在本例中为this === document.body 非常感谢您的快速回复!这就像一个魅力,也很干净。谢谢!【参考方案2】:

Matt 给出的解决方案可能是可行的方法。

只是想我会指出你可以像这样通过事件对象传递数据:

function Map() 
    this.x = 0;
    this.y = 0;

// Pass object with data-------------v
    $("body").bind('mousemove', ths: this, function(event) 
            // access this via event.data
        event.data.ths.x = event.pageX;
        event.data.ths.y = event.pageY;     
    );

这只是为了提供信息。这真的不是一个实际的应用程序。 Matt 对局部变量的引用更有意义。

【讨论】:

我不知道你能做到这一点——不过这很有趣。你是对的,这不是一个非常实用的应用程序,但它可能会在未来派上用场。感谢您的提示! 我发现自己处于这样的境地,这是唯一的出路 - 谢谢!【参考方案3】:

您还可以使用JQuery.proxy 来创建带有上下文的代理函数。您可以将代理绑定到事件。

这是一个例子:

var init_handler  =  $.proxy(this.init, this);
$('#page_id').bind('pageinit', init_handler);

【讨论】:

以上是关于在 Javascript 中访问事件处理程序中的类成员变量的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript学习之事件委托

JavaScript性能优化之事件委托

Vanilla JavaScript 中的事件处理程序命名空间

处理 WPF 用户控件的事件

Javascript - 事件处理程序中的箭头函数?

如何在uiwebview中处理Javascript onorientationchange事件