2011-12-16 30 views
0

次のGreasemonkeyスクリプトを作成し、すべてのWebサイトでFirefox上で実行されました。ここにスクリプトがあります。スクリプトは、基本的にページ上のすべてのリンクを取得し、リンク数を警告します。これは私が取り組んでいるプロジェクトの小さな部分です。GreasemonkeyスクリプトがRedditで期待どおりに動作しない

window.addEventListener("load", function(e) { 
      var links = window.document.getElementsByTagName("a"); 
      //window.setTimeout(function(){alert(links.length);},3000); 
      alert(links.length); 
     }, false); 

スクリプトは、いくつかのウェブサイトのために細かい実行されますが、私はredditにアクセスしたときに、スクリプトは、2リンクの代わりに、ページ上に存在するすべてのリンクを返しています。このページにあるdivsを検索しようとしたときにも、2だけ戻ってきました。

私はページソースを調べたところ、インラインJavaScriptに関するものがありました。しかし、私はそれを完全に理解できませんでした。誰も私がなぜこれは動作していない助けてくださいできますか?

おかげで、 シド

+1

Redditはおそらく、ajax経由でコンテンツを読み込みます。つまり、ページが読み込まれた後、実際のコンテンツは後で読み込まれます。したがって、タイミング問題のためにあなたのスクリプトが失敗します。 – mrtsherman

+0

@mrtsherman私は、ページソースがそのようには見えないことを確信しています。私はかなりすべてがページの読み込みに読み込まれていると確信しています。私はコメントされたコードが示唆するように、タイムアウトを使ってみました。それはうまくいきませんでした。 – Sid

+1

示されたコードはRedditで完全にうまく動作します。あなたが私たちに見せてくれない** **問題です。完全なスクリプトと問題のある* exact *ページへのリンクを提供してください。 –

答えて

1

それはAJAXコンテンツをロードすることがあります。デバッガからコードを実行すると正常に動作します。したがって、唯一の説明は、コンテンツがloadイベントの後に存在しないということです。タイムアウト(醜いが、これは私のポイントを証明する必要があります)でそれをラッピングしてみてください。

setTimeout(testLinks, 3000); 

function testLinks() { 
    window.addEventListener("load", function(e) { 
     var links = window.document.getElementsByTagName("a"); 
     //window.setTimeout(function(){alert(links.length);},3000); 
     alert(links.length); 
    }, false); 

} 

問題がどのようなものか分かったので、このSO質問の指示に従ってAJAXイベントリスナーを作成できます。次に、新しいコンテンツが読み込まれるたびにリンク数を再計算することができます。

JavaScript detect an AJAX event

+0

詳細な説明をありがとう。しかし、スクリプトの実行を妨げているクライアント側でアプリケーションが使用している可能性があるセキュリティ対策について考えることはできますか?ただ興味があるだけ。 – Sid

+1

これはセキュリティ対策ではなく、ページの仕組みだけです。あなたのスクリプトは完璧に実行されますが、コンテンツがまだ存在しないという問題があります。ページがロードされた後、サーバーに非同期要求が行われます。これにより、より多くのコンテンツが取得され、動的にページに読み込まれます。残念ながら、この時間までにあなたのJavaScriptはすでに実行されています。だからあなたがする必要があるのは、それらのデータロードイベントを検出し、それぞれのリンクの数を再計算することです。 – mrtsherman

+0

詳細な説明をありがとうございます。 – Sid

関連する問題