1

我想在 mootools 的 Element 成员中实现一些函数和变量。我有这样的东西

Element.prototype.currentChild = this.getFirst();
Element.prototype.scrollToNext = function(delta, tag){ .... }

之后我创建一个新元素并将鼠标滚轮事件绑定到一个跨度并访问它的 currentChild。

body_container = new Element('div', {
events:{
            'mousewheel': function(e){
                var elem = new Element(this);
                elem.currentChild.setStyle('background-color', 'transparent');
                elem.scrollToNext(e.wheel);
                elem.currentChild.setStyle('background-color', '#C6E2FF');
                e.stop();
            }
        }
    });

问题是我收到以下错误:

未捕获的类型错误:对象 [对象窗口] 没有方法“getFirst”

你知道这可能是什么原因吗?

LE:是的,我期待“this”成为一个元素。但我不明白为什么它会是 Window 类型。

4

2 回答 2

1

使用 Implement 更改原型。并且您将需要一个函数,不能说它something.prototype.method = this.somethingsMethod没有绑定在方法的执行上下文之外。

Element.implement({
    currentChild: function() {
        return this.getFirst();
    },
    scrollToNext: function() {}
});

MooTools 也有别名。

Element.alias('currentChild', 'getFirst');

https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L223-225 - 当您不想重新实现时,类型方法的别名。

老实说,你为什么不能只使用元素存储呢?

'mousewheel': function(e) {
    var elem = document.id(this),
        first = elem.retrieve('currentChild');

    first || elem.store('currentChild', first = elem.getFirst());

    first.setStyle('background-color', 'transparent');
    elem.scrollToNext(e.wheel);
    first.setStyle('background-color', '#C6E2FF');
    e.stop();
}
于 2012-07-30T20:26:14.787 回答
0

感谢您的快速回答。同时,我找到了一种基于 Dimitar first solution 的方法。它看起来像这样:

Element.implement({ 
    currentChild: function(){ 
        if(!this._currentChild) this._currentChild = this.getFirst(); 
        return this._currentChild; 
    }
 } 
于 2012-07-31T15:49:56.400 回答