Javascript 为什么在使用MooTools定义伪事件时Firefox中的事件未定义?

Javascript 为什么在使用MooTools定义伪事件时Firefox中的事件未定义?,javascript,events,mootools,mootools-events,Javascript,Events,Mootools,Mootools Events,我试图用MooTools定义一个伪事件。它可以在Chromium中工作,但不能在Firefox中工作。这两款浏览器都是最新的稳定版本。 以下是我的活动: DOMEvent.definePseudo('ctrl', function(split, fn, args){ if(event.ctrlKey == true) fn.apply(this, args); // this is where Firefox says undefined }); 如果在单击某个元素时按下crtl键,则

我试图用MooTools定义一个伪事件。它可以在Chromium中工作,但不能在Firefox中工作。这两款浏览器都是最新的稳定版本。 以下是我的活动:

DOMEvent.definePseudo('ctrl', function(split, fn, args){
    if(event.ctrlKey == true) fn.apply(this, args); // this is where Firefox 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);
    }
});
有任何提示或想法为什么会出现这种错误?
我的想法是,我不传递
事件
,但我不知道如何传递,因为我的代码在Chromium和其他浏览器中工作。

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

如果(event.ctrlKey==true)fn.apply(该参数)

应该是:

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

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

使用
元素还可以轻松地添加其他自定义事件,如control+click。事件:

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');
});

如果检查
doEvent.definePseudo
函数中的参数,您将看到没有
event
对象,而是
args
数组,其中event对象是该数组的第一个元素。因此,不是:

如果(event.ctrlKey==true)fn.apply(该参数)

应该是:

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

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

使用
元素还可以轻松地添加其他自定义事件,如control+click。事件:

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');
});