使用MooTools定义伪事件时,为什么firefox中的事件未定义?

时间:2013-05-17 14:43:13

标签: javascript events javascript-events mootools mootools-events

我正在尝试使用MooTools定义伪事件。它适用于铬,但不适用于Firefox。这两款浏览器都是最新的稳定版本。 这是我的活动:

DOMEvent.definePseudo('ctrl', function(split, fn, args){
    if(event.ctrlKey == true) fn.apply(this, args); // this is where FF says undefined
});

如果在单击元素时按下了crtl键,则应该触发。 这是我添加事件的方式:

this.element.addEvent('click:ctrl', function(event) {
    event.stop();
    data = this.retrieve('imageData');
    this.toggleClass('selected');

    if(this.hasClass('selected')) {
        gallery.collection[data.id] = data;
    } else {
        Object.erase(gallery.collection, data.id);
    }
});

出现此错误的任何提示或想法? 我的想法是,我没有通过event,但我不知道如何做到这一点,因为我的代码在chrome和其他浏览器中工作。

1 个答案:

答案 0 :(得分:4)

如果检查DOMEvent.definePseudo函数中的参数,您将看到没有event对象,但args数组,其中事件对象是该数组的第一个元素。所以而不是:

  

if(event.ctrlKey == true)fn.apply(this,args);

应该是:

  

if(args [0] .control == true)fn.apply(this,args);

事件对象通常作为第一个参数传递给事件处理程序,而definePseudo实际上是事件处理程序处理程序,您应该决定事件处理程序将发生什么。您的代码在Chrome上运行的原因(IE,Safari和Opera也支持)是因为它们始终提供全局事件变量,但在Firefox中,您需要将事件对象作为参数传递给事件处理程序。 / p>

使用Element.Events:

也可以轻松添加其他自定义事件,例如控制+点击
Element.Events.controlclick = {
    base: 'click',  // the base event type
    condition: function(event){     //a function to perform additional checks
        return (event.control == true);   // this means the event is free to fire
    }
};

$('test').addEvent('controlclick', function(event){
    console.log( 'the user clicked the left mouse button while holding the control key');
});