我正在尝试使用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);
}
});
任何提示或想法为什么会发生此错误?我的想法是,我不通过event
,但是我不知道如何执行此操作,因为我的代码可在Chromium和其他浏览器中使用。
如果检查DOMEvent.definePseudo
函数中的参数,您将看到没有event
对象,但有args
数组,其中事件对象是该数组的第一个元素。因此,代替:
如果(event.ctrlKey == true)fn.apply(this,args);
应该是:
如果(args [0] .control == true)fn.apply(this,args);
事件对象通常作为第一个参数传递给事件处理程序,definePseudo实际上是事件处理程序处理程序,您应在其中确定事件处理程序将要发生的情况。您的代码可在Chrome上运行的原因(IE,Safari和Opera也受支持)是因为它们始终提供全局事件变量,但是在Firefox中,您需要将事件对象作为参数传递给事件处理程序。] >
[Element.Events:
也可以轻松实现添加其他自定义事件,例如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');
});