彼らがイベント ハンドラーとして使用している関数をラップできますか? この不自然な例を見てみましょう:
var someObject = {
keyDownListener: function() {
alert('something was pressed!');
}
}
keyDownListener を、イベント オブジェクトを受け入れる独自のメソッドに置き換えることができます。
var someObject = {
keyDownListener: function() {
alert('something was pressed!');
}
}
var oldKeyDownListener = someObject.keyDownListener;
someObject.keyDownListener = function(event) {
oldKeyDownListener(); // Call the original
// Do anything we need to do here (or before we call the old one!)
}
関数の内部に入ることができれば、引数オブジェクトを調べることもできます。あなたのイベントオブジェクトはそこにあるはずです(最初のアイテムだと思います)。
var f = function() {
console.log(arguments);
}
f(); //= Logs []
f(1); //= Logs [1]
f(1, 'something'); //= Logs [1, 'something']
編集(以下のコメントに応じて)。
メソッドを「ハイジャック」できる場合は、次の 1 つの方法を使用できます。これが良いアプローチかどうかはわかりませんが、これらすべての制約がある場合は、必要なものが得られます。基本的に、このコードが行うことは、onclick 属性を持つ要素を検索し、イベント オブジェクトを含むようにメソッド シグネチャを変更することです。
次に、元のリスナーをラップしてイベント オブジェクトを引数から取り出し、実行を元の関数に戻すことができます。
これを行うと、必要なものが得られます(私は思いますか?)。このコードを参照してください:
HTML:
<a href="#" onclick="javascript:myFunction(1, 2, 3);">Click Me</a>
JavaScript:
window.myFunction = function(one, two, three) {
console.log("one: " + one + ", two: " + two + ", three: " + three);
}
var originalMyFunction = window.myFunction;
window.myFunction = function() {
var event = arguments[arguments.length - 1]; // The last item in the arguments array is our event object.
console.log(event);
originalMyFunction.apply(this, arguments);
}
$('[onclick]').each(function() {
var s = $(this).attr('onclick');
var lastIndex = s.lastIndexOf(')');
var s2 = s.substring(0, lastIndex);
var s3 = s.substring(lastIndex, s.length);
var s4 = s2 + ', event' + s3;
$(this).attr('onclick', s4);
});
このフィドルで動作することがわかります: http://jsfiddle.net/84KvV/
編集2
あなたが本当にそれを使いこなしたいのであれば、関数のラッピングを自動化することさえできます. このフィドルを参照してください: http://jsfiddle.net/84KvV/2/。
これは、関数文字列が特定の形式であることを期待しているため、解析できることに注意してください (functionName(...))。その形式ではない場合、この正確なコードは機能しません:)