4

基本的にモンキーパッチを適用することで、動作または JavaScript ライブラリを変更しようとしています (いいえ、これ以上の方法はありません)。

コードのある時点で、Shift キーが押されているかどうかを知る必要があります。このライブラリのイベント ハンドラが適切に記述されていれば、最初のパラメータとして「イベント」を受け取りますが、残念ながらそうではありません (イベントは HTML の onclick インラインで配線されています)。

そのため、jQuery が最後のイベント オブジェクトをどこかに「保存」するかどうか、またはそれにアクセスする他の方法があるかどうかを確認しようとしています。

本来は「window.event」が欲しいのですが、できればFirefoxでも動くようにしたいです。

グローバルな onKeyDown ハンドラーをドキュメントに追加し、Shift の状態を自分で追跡する以外に、何かアイデアはありますか? それは少しやり過ぎで、私の好みには少しグローバルすぎるように感じます.

4

3 に答える 3

2

私のコメントで述べたように、IEではないブラウザにwindow.eventを存在させることは可能です。attachEvent/addEventListenerをラップする必要があります。それは次のようになります:

var oldAddEventListener = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function(type, listener, useCapture) {
    var wrapped = function(event) {
        window.event = event;

        listener(arguments);
    }

    oldAddEventListener.call(this, type, wrapped , useCapture);
}

私が言ったように、これがインラインイベントリスナーで機能するかどうかはわかりませんが、そうでない場合は、少なくとも、似たようなものを探している人のためのリファレンスとしてここにあります。

于 2012-07-20T20:50:22.317 に答える
2

彼らがイベント ハンドラーとして使用している関数をラップできますか? この不自然な例を見てみましょう:

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(...))。その形式ではない場合、この正確なコードは機能しません:)

于 2012-07-20T20:07:44.877 に答える