2

ページ機能を置き換える Greasemonkey スクリプトを作成しました。

(function() {
    var oldFunc = func;
    func = function() {
        oldFunc();
        // other stuff
    };
)();

私は常にこのスクリプトが Gresemonkey と Chrome の両方で動作することを意図しており、Chrome は をサポートしていないことを読んでいたunsafeWindowため、関数を文字列に変換し、次を使用してスクリプトをページに挿入していますsetTimeout

setTimeout("(function(){var old=func;func=function(){old();/*other stuff*/}}())", 0);

これは Greasemonkey では完全に機能しますが、Chrome ではまったく何も得られません。明らかに起動していませんが、ログにも何も表示されません。他の多くの注入スタイルを試しましたが、何も機能しません。(テストのためalert()に、関数の先頭に an も追加しました。)

  1. setTimeout(..., 0)- なし
  2. ページに挿入せずにスコープ内で関数を実行する - アラートは表示されないが、コンソールで「関数が定義されていません」
  3. document.href = "javascript:..."- なし
  4. document.body.addEventListener("load", ...)- なし

これらはすべて付いてい@run-at document-endます。

残念ながら、これは私の最初の Chrome ユーザースクリプトであり、1 時間ほどグーグルで検索して SO をいじった後でも、デバッグ方法について途方に暮れています。何か助けはありますか?

現在 Greasemonkey で動作している実際のスクリプト: http://pastebin.com/HtLVjYHg

4

1 に答える 1

4

結局、Chrome で機能する唯一の手法は、<script>DOM メソッドを使用してノードを作成することでした。幸いなことに、これは Firefox と Opera で同じようにうまく機能するようで、次の方法でかなり楽になります<func>.toString():

function embed() {
   var oldFunc = window.func;

    window.func = function() {
        oldFunc();

        // other stuff
    };
}

var inject = document.createElement("script");

inject.setAttribute("type", "text/javascript");
inject.appendChild(document.createTextNode("(" + embed + ")()"));

document.body.appendChild(inject);

最終スクリプト: http://userscripts.org/scripts/review/84394

于 2010-08-30T17:11:47.760 に答える