0

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や他のブラウザで動作しているので、これを行う方法がわかりません.

4

1 に答える 1

4

関数の引数を調べると、オブジェクトではなく配列でDOMEvent.definePseudoあることがわかります。ここで、イベント オブジェクトはその配列の最初の要素です。したがって、代わりに:eventargs

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

次のようにする必要があります。

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

イベント オブジェクトは通常、イベント ハンドラーの最初の引数として渡されます。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');
});
于 2013-05-17T20:47:37.417 に答える