1

注意:代码看起来很长,但其简单的伪代码用于演示目的。不要逃跑!

我编写了一个监听按键的小部件。当onKeyDown事件被触发时,对的引用将this丢失。所以我设置了一个作用域变量self来引用小部件。 self在创建小部件时初始化。

这可行,但我不确定这是正确的方法。我认为这里的解决方案与代理有关?也许self变量已经在充当代理?有人想对发生的事情有所了解吗?

(function($)
{   
    var vendorPrefix = Modernizr.prefixed("transform");
    var self;

    $.widget("ui.myWidget", {

        _create: function()
        {  
            self = this;            
            //Do some widget stuff  
            document.addEventListener('keydown', this.onKeyDown, false)
            return this;
        },

        exampleFn: function()
        {
        },

        onKeyDown: function(event)
        {
            // this now refers to "document" and not the widget             
            switch(event.keyCode)
            {
                case 37: 
                    self.exampleFn();
                    break;
                case 39:
                    self.exampleFn();
                    break;
            }
        }

    });
})(jQuery);
4

3 回答 3

1

如果您想摆脱变量,也可以使用jQuery.proxy() :self

onKeyDown: $.proxy(function(event)
{
    // this now refers to "document" and not the widget             
    switch(event.keyCode)
    {
        case 37: 
            this.exampleFn();
            break;
        case 39:
            this.exampleFn();
            break;
    }
}, this)

无论如何,正在发生的事情是this在一个函数中引用该函数。所以thisinonKeyDownonKeyDown函数。如果你像我上面那样使用代理,thisinonKeyDown将成为对父函数的引用。

更多关于thisJavaScript 中的行为:“this”关键字是如何工作的?

于 2012-09-06T16:44:39.607 回答
0

这是因为“this”关键字指的是附加事件的对象。

使用自提示是一个不错的选择。

于 2012-09-06T16:28:34.793 回答
0

我不确定您所说的代理是什么意思,因为 javascript 中没有这样的东西,但是不,这不是正确的做法,因为您实际上已经创建了一个全局变量。

例如,如果小部件被多次初始化,您可能会看到一些非常奇怪的行为,具体取决于您的代码。

摆脱全局var self并将其移至_create对象声明内的方法上方,因此它是该对象的私有变量。

于 2012-09-06T16:41:28.890 回答