1

mootools を使い始めてしばらく経ちますが、まだネイティブで遊んでいるわけではありません。現在、オリジナルの横にカスタム addEvent メソッドを追加して、イベントを拡張しようとしています。次のコードを使用してそれを行いました(mootoolsコアからコピー)

Native.implement([Element, Window, Document], {
    addMyEvent:function(){/* code here */}
}

fireEventここでの問題は、独自のロジックを実行した後でも元のメソッドを呼び出すことができるように、既存のメソッドを適切に上書きする方法を理解できないように見えることです。

私はおそらくいくつかの醜いハックで望ましい結果を得ることができましたが、エレガントな方法を学びたいです:)


更新: 醜いハックをいくつか試しました。それらのどれも機能しませんでした。クロージャーを理解していないか、間違った場所を調整しています。一時変数に保存しようとElement.fireEventしました(クロージャーを使用する場合と使用しない場合)。その後、上書きされたfireEvent関数から呼び出します(使用して上書きNative.implement-上記と同じ)。fireEventその結果、自分自身を何度も呼び出す無限ループになります。

更新 2: firebug を使用して実行を追跡したところNative.genericize、ネイティブ クラスのメソッドの一種のプロキシとして機能しているように見える にたどり着きました。そのため、実際の fireEvent メソッドを参照する代わりに、プロキシを参照したため、無限ループが発生しました。Google はこれに関する有用なドキュメントを見つけられませんでした。私は、それがどのように機能するかを完全に理解していないときに、ボンネットの下を突っ込むことに少し警戒しているので、どんな助けも大歓迎です.


更新 3 - 元の問題の解決: 以下の Dimitar のコメントに返信したように、元の問題を自分で解決することができました。一定量の実行後に自分自身を破壊するイベントを追加する方法を作ろうとしていました。元の問題は解決されましたが、ネイティブの拡張に関する私の疑問は残ります。

完成したコードは次のとおりです。

Native.implement([Element, Window, Document], {
addVolatileEvent:function(type,fn,counter,internal){
    if(!counter)
        counter=1;
    var volatileFn=function(){
        fn.run(arguments);
        counter-=1;
        if(counter<1)
        {
            this.removeEvent(type,volatileFn);
        }
    }
    this.addEvent(type,volatileFn,internal);
}
});

名前は正しいですか?限られたボキャブラリーで思いつくのはこれが精一杯です。

4

1 に答える 1

1
document.id("clicker").addEvents({
    "boobies": function() {
        console.info("nipple police");
        this.store("boobies", (this.retrieve("boobies")) ? this.retrieve("boobies") + 1 : 1);
        if (this.retrieve("boobies") == 5)
            this.removeEvents("boobies");
    },
    "click": function() {
        // original function can callback boobies "even"
        this.fireEvent("boobies");
        // do usual stuff.
    }
});

通過した反復回数をカウントしてから自己破壊する単純なイベントハンドラーを追加します。

イベントは、特定のキーの下にある単純なコールバックと考えてください。そのうちのいくつかは、起動される特定のイベントにバインドされています。

要素ストレージを使用することは、可能であれば常に推奨されます。これにより、複雑なパンクチャやグローバル変数なしで、異なるスコープ間で同じ要素のデータを共有できます。

ネイティブはそのように改造されるべきではありません。

Element.implement({
    newMethod: function() {
        // this being the element
        return this;
    }
});

document.id("clicker").newMethod();

もちろん、ウィンドウやドキュメントにも適用される何かを定義する必要がある場合を除きます。

于 2010-06-28T15:59:53.187 に答える