9

JavaScript関数が匿名で宣言されている場合、それまたはその一部をオーバーライドする方法はありますか?

google.com のインスタント検索が上下の矢印キーをハイジャックして検索ランキングを移動するのを阻止しようとしています。問題のあるコード セクションと思われる部分を特定しました。キーコード 38 と 40 は、ダウン キーとアップ キー用です。

if (b == 40) aa(f);
else if (b == 38) aa(j);
else if (b == 37 || b == 39) if (!ca(b == 39)) return f;
a.preventDefault && a.preventDefault();
return a.returnValue = j

問題は、これが Sb = function (a) {} という関数の一部であり、約 3,000 行の無名関数の中にあることです。SO hereに投稿された同様の質問があり、著者は私には当てはまらないハッキーな方法で解決しました。インスタント検索をオフにできることはわかっていますが、気に入っています。矢印キーが機能しなくなったことに我慢できません。

解決:

上/下矢印キーの機能をスクロールに戻すクロム拡張機能を作成することになりました。次のコードを使用しました。Razeとモフルに感謝します。

if (event.keyCode == 40 || event.keyCode == 38)  {
    event.cancelBubble = true;
    event.stopPropagation();            
    return false;
}
4

4 に答える 4

3

別の無名関数内で無名関数をオーバーライドすることはできません。既存の関数の一部を変更することはできません。関数のソースを取得して操作し、ソースから新しい関数を作成することはできますが、新しい関数を作成して必要な場所にアタッチする必要があります。

ここで、関数の再定義を必要としないこの問題について 2 つの提案があります。

  1. キャプチャ段階で入力テキスト ボックスのイベント リスナーを追加し、keyCode が UP または DOWN の場合にイベントをキャンセルする
  2. 実際にテキストを入力するオーバーレイ テキスト ボックスを作成し、UP キーと DOWN キーを除くすべてのイベントを下の実際のテキスト ボックスに渡します。
于 2011-04-28T07:41:38.737 に答える
2

これは、矢印キー イベントをキャプチャしてバブリングを防ぐことで簡単に実行できます。

window.addEventListener('keydown', function(e) {
    e.stopPropagation();
}, true);

テスト済みで、google.com で動作します

于 2011-05-04T20:09:51.947 に答える
0

要素をそれ自体のクローンに置き換えて要素からすべてのイベントリスナーを削除し(node.parentNode.replaceChild(node.cloneNode(true), node))、次に手動で変更したバージョンのGoogleのJavaScriptコードを適用します()。document.documentElement.appendChild(document.createElement("script")).src="location of your modified script"

于 2011-04-30T01:38:39.670 に答える
-1

関数が実行される前に、ハードコア置換を使用してみてください。

document.body.innerHTML = document.body.innerHTML.replace(/if (b == 40) aa(f);/,'').replace(/else if (b == 38) aa(j);/,'').replace(/else if (b == 37 || b == 39) if (/a.preventDefault && a.preventDefault();/,'').replace(/return a.returnValue = j/,'')

おそらくそれはうまくいくでしょう

于 2011-05-04T16:57:25.893 に答える