2

私はグリースモンキー スクリプトを書いていて、ページが読み込まれた後に一度だけstart関数を呼び出したいと思っています - それは facebook のためです。まず、次のコードから始めました。

function start(){
    alert("hello");
}

start();

start() 関数が複数回実行されました。そこで、コードを次のように変更しました。

jQuery.noConflict();
window.stoop = 0;
jQuery(document).ready(function(){
    if(window.stoop == 0){
        start();
    }
    window.stoop = 55;
    //or window.stoop++;
});


function start(){
    alert("hello");
}

問題は、window.stoop の値が変わらないことです。

で試しました

var stoop = 0;
stoop++;

var obj = {};
obj.stoop = 0;
obj.stoop++;

も、これらの方法はどちらもうまくいきませんでした。

私は何を間違っていますか?私は今ヨーロッパにいます - 夜なので、後であなたの質問に答えます.

4

1 に答える 1

3

問題は、Greasemonkey スクリプト全体が複数回実行されていることです。@includeGreasemonkey は、iframe がスクリプトの、@exclude、および@matchディレクティブと一致する場合、メイン ページであるかのように iframe で実行されます。

そのような状態を追跡しようとしても意味がありません。関数は、意図的に複数回呼び出さない限り、スクリプトの実行ごとに 1 回だけ実行されます (これは質問には示されていません)。また、スクリプトは通常、実行インスタンス間で情報を共有できません (ここでも必要ありません)。

また、スクリプトをターゲット ページに挿入しない限り、デフォルトjQuery(document).ready()で Greasemonkey が起動するため、使用する必要はありません。document.ready

複数実行の問題を解決するには:

  1. 、、およびディレクティブを調整して@include、望ましくない iframe を可能な限り排除します。 @exclude@match
  2. スクリプトの上部近くに次のようなコードを追加します。

    if (window.top != window.self)  //-- Don't run on frames or iframes.
        return;
    
于 2012-08-25T01:59:34.470 に答える