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);
}
});
名前は正しいですか?限られたボキャブラリーで思いつくのはこれが精一杯です。