Mootools onClick发送对象

时间:2013-04-02 16:03:35

标签: javascript mootools

我试图将一个物体从另一个物体发送给另一个物体。

var Tile = new Class({
    initialize : function(){
        this.inner = new Element(...);
        this.inner.addEvent('click', function() {
            popup.open(this);
        });
    }
});

如果我警告任何成员变量来自Tile out op Popup,它会警告'undefined'。 我做错了什么?

var Popup = new Class({
    initialize : function(){
    },
    open : function(tile) {
        alert(tile.width);
    }
});

亲切的问候!

2 个答案:

答案 0 :(得分:2)

当您将this传递给popup对象时,您传递的是元素本身(我相信这是您的意图)。但是,默认情况下,元素不具有名为width的属性。

也许您正在寻找getSize();?这将返回一个双属性对象(xy),分别对应于元素的宽度和高度。

我已将您的代码近似为以下jsFiddle,请尝试一下:http://jsfiddle.net/g4SmJ/

供参考,这是新的Popup类代码:

var Popup = new Class({
    initialize : function(){
    },
    open : function(tile) {
        size = tile.getSize();
        console.log(size);    // console.log provides a nicer interface for debugging, you can pass objects into it! Use the Chrome Inspector or Firebug to see its output.
        alert(size.x);
    }
});

回应你的评论:

  哦,我并不打算提醒doms宽度,对不起。我发布的是来自完整对象的较小代码。宽度实际上是Tiles中定义的成员,我想要提醒Popup

在这种情况下,当您将呼叫发送到.open();时,您将this传递给函数调用,但您没有传递Tile对象!相反,您传递了您创建的inner元素。

如此重写Tile

var Tile = new Class({
    initialize : function(){
        var self = this;
        this.inner = new Element(...);
        this.inner.addEvent('click', function() {
            popup.open(self);
        });
    }
});

答案 1 :(得分:1)

我猜你想要发送Tile个实例。 与上面的答案一样 - 当您在this方法内发送addEvent时,您发送的元素本身就是调用事件:在您的情况下,您正在发送内部实例,因为您在其上定义了onclick。

如果要发送磁贴实例,则有2个选项:

1)绑定到函数this - 意味着“连接”您在(Tile)中的当前范围到事件中:

var Tile = new Class({
    initialize : function(){
        this.inner = new Element(...);
        this.inner.addEvent('click', function() {
            popup.open(this); // <- now this is 'Tile' instance 
        }.bind(this)); //bind this to click
    }
});

2)将实例保存在函数范围之外并在其中使用:

var Tile = new Class({
    initialize : function(){
        this.inner = new Element(...);
        var self = this; //save the this to var 'self'
        this.inner.addEvent('click', function() {
            popup.open(self); //use self which holds the Tile instance
        });
    }
});