2

私は Facebook 用の Greasemonkey スクリプトを作成しようとしていますが、ファンキーなページ/コンテンツの読み込みに問題があります (これはよくわかりません - 多くのリンクは実際には GET を変更しているだけですが、何らかのサーバー リダイレクトを行って、URL がブラウザにも同じように見えるようにしますか?)。基本的に必要な唯一のテストはGM_log()、スクリプトに a を単独で配置することです。Facebook あたりをクリックすると、パターンとして facebook.com/* であっても実行されないことがよくあります。私にできることはありますか、それとも「ページの読み込み」のアイデアは Greasemonkey で修正されており、FB は単一の URL を使用してそれを実行しないように「だまして」いますか?

次のような基本的なコンテンツ操作を実行しようとすると、次のようになります。

    GM.log("starting");
    var GM_FB=new Object;
    GM_FB.birthdays = document.evaluate("//div[@class='UIUpcoming_Item']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (i = GM_FB.birthdays.snapshotLength - 1; i >= 0; i--) {
       if (GM_FB.birthdayRegex.test(GM_FB.birthdays.snapshotItem(i).innerHTML)) {
          GM_FB.birthdays.snapshotItem(i).setAttribute('style','font-weight: bold; background: #fffe88');
       }
    }

その結果、手動でページを更新するだけで機能する場合があります。Firebug コンソールを引き上げてコードを強制的に実行すると、問題なく動作します。これは、DOM の特定の部分の読み込みが遅いためではないことに注意してください。関連する要素を待機するコードを後で追加しましたが重要なことに、特定の遷移についてメッセージがログに記録されることはありません。たとえば、メッセージからニュース フィードに切り替えて戻るときです。

4

1 に答える 1

3

div にコンテンツをロードするために ajax を使用していませんか? たとえば、 Firebugを使用して、更新されている要素を見つけることができます。

何かをクリックすると URL が変更されますが、URL に が#あり、この後にテキストが続く場合、テキストはパスではなくパラメーターであることを意味し、ブラウザは現在のページを変更しません。したがって、GreaseMonkey はページがリロードされていないため、ページ上のスクリプトが再度挿入されることはありません。あなたの例のように、URLfacebook.com/#!/sk=messagesはそれから離れていないため、イベントfacebook.com/は発生しません。window.loadそのため、変更されている要素を見つけて、その要素にイベント リスナーを追加する必要があります。前に述べたように、Firebug を使用することができます。

どの要素がコンテンツを取得しているかがわかったら、ページではなくその要素にイベント リスナーを追加する必要があります (GreaseMonkey はウィンドウの読み込みイベントでのみ追加します)。

したがって、GMスクリプトでは(「エアコード」)

document.getElement('dynamic_div').addEvent('load', /*your script*/);
于 2010-05-20T11:40:23.803 に答える