これは一般的な問題です。そのページは AJAX を使用して、コンテンツの一部だけを置き換えています。したがって、jQuery のready
イベントのトリガーは機能しません。これは、最初の完全なページの読み込み後にのみ発生するためです。
参照用の通常の回避策/アプローチを次に示します。私は最初のものだけをお勧めします:
waitForKeyElements()などの堅牢なポーリング ユーティリティを使用します。これには、外部スクリプトをロードする必要があり (通常は問題ありません)、とにかく使用する必要がある jQuery が必要です。このアプローチについては、以下で詳しく説明します。
イベントをトリガーしhashchange
ます。一部のページは、AJAX がページを変更したときにこのイベントを発生させるのに十分です。残念ながら、Stack Overflow はそうした「礼儀正しい」サイトの 1 つではありません。;-)
URL への他の変更をトリガーします。一部のページは、AJAX がコンテンツを変更するときに URL を変更するのに十分です。スタック オーバーフローはこれを行います。
残念ながら、SO の場合、URL はすぐに変更されますが、実際のページの変更は一定の (予測不可能な) 遅延の後に発生します。つまり、他の手法のいずれかも使用する必要があります。
ページの AJAX をインターセプトします。これは複雑で煩雑になる可能性があり、実際のページ変更は AJAX 要求が終了してから可変間隔で発生する可能性があるため、多くの場合、ポーリングまたは遅延が依然として必要です。ページが作成する可能性のある多くのタイプの中から正しい AJAX リクエストを特定することも面倒です。
sを使用MutationObserver
します。これは最も強力な手法であり、ポーリングに対して変更主導です。しかし、ほとんどの場合、やり過ぎで、実装が難しく、CPU スパイクでコンピューターが「フリーズ」する可能性があります。
古い手法であるMutation Eventsは時代遅れであり、正当な理由により非推奨であることに注意してください。一部のブラウザーではまだこの機能が削除されていませんが、使用しないでください。
AJAX 駆動のページに対するほとんどすべてのスクリプティングで、私たちが本当に必要としているのは、特定の種類のコンテンツを操作することだけです。技術はそのコンテンツを識別することであり、対象となるペイロードが追加または置換されるたびに、waitForKeyElements()のようなユーティリティを使用して起動するのは簡単です。
あなたの場合、コンテンツは、この HTML に表示されるタグ リストのように見えます。
<div id="user-tab-tags">
...
<div class="user-tab-content">
<table class="user-tags">
...
</table>
</div>
...
</div>
そのtable.user-tags
タブのソート/ページネーションオプションを変更するたびに置き換えられます。
したがって、そのコンテンツの jQuery セレクターは次のようになります。
"#user-tab-tags div.user-tab-content table.user-tags"
スタイルを変更する完全なスクリプトは次のようになります。
// ==UserScript==
// @name _AJAX_compensation techniques
// @include http://stackoverflow.com/users/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
waitForKeyElements (
"#user-tab-tags div.user-tab-content table.user-tags",
customStyleUserTags
);
function customStyleUserTags (jNode) {
jNode.css ("background", "lime");
//***** YOUR CODE HERE *****
}