0

我想用MooTools定義一個僞事件。它適用於鉻,但不適用於Firefox。這兩款瀏覽器都是最新的穩定版本。 這裏是我的事件:爲什麼在使用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,但我沒有想法如何做到這一點,因爲我的代碼在鉻和其他瀏覽器中工作。

回答

4

如果您檢查DOMEvent.definePseudo函數中的參數,您將看到沒有event對象,但是args數組,其中事件對象是該數組的第一個元素。所以而不是:

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

應該是:

如果(參數[0]。控制== TRUE)fn.apply(此,參數);

事件對象通常作爲第一個參數到事件處理程序過去了,definePseudo實際上是事件處理程序處理程序,你應該決定將事件處理程序發生什麼。您的代碼在Chrome上運行的原因(在IE,Safari和Opera中也支持)是因爲它們始終提供全局事件變量,但在Firefox中,您需要將事件對象作爲參數傳遞給事件處理程序。像控制+點擊

添加額外的自定義事件,也可以很容易地與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'); 
}); 
+0

+1有趣的見解實現。 –

+0

謝謝!這個伎倆。 – lino