0

タイトルがあいまいな場合はお詫びしますが、説明するのが最も簡単な質問ではありません。現在、などの組み込み関数をブラウザでラップ/オーバーロードXmlHttpRequest.prototype.open = function(){return oldOpen(...)}し、ページ内のスクリプトが実行される前に実行する場合は、ブラウザ拡張機能/アドオンを使用する必要があります。ドキュメントの解析が開始されます。重要なのは、ブラウザ拡張機能は、インストールに同意するユーザーのコンバージョン率が低いことが多いということです。ブックマークレットを使用して同じことを実行できるようにしたいと思います(そしてPinterestは、ブックマークレットがそれらの障壁ではないことを示しています!)。しかし、残念ながら、ブックマークレットは、定義上、ドキュメントがロードされてからずっと後に実行されます。

私がやりたいこと、そして理論的には可能だと思うことは、ページのリロードを偽造することですが、スクリプトはすでに挿入されています。プロセスは次のようになります。

  1. XHRを介して、から元のドキュメントをダウンロードしwindow.locationます。
  2. すべてのスクリプトタグを含むすべての要素をDOMから削除します。たぶん、良いユーザーエクスペリエンスのために素敵なスプラッシュスクリーンを投げてください。
  3. すべてのタイムアウトと間隔をクリアします(FFとChromeでは、IDは1からカウントアップするように見えるため、事前の知識は必要ありません)。
  4. window空白のドキュメントに含まれていないすべてのキーを削除/定義解除しますdocument...一部の拡張機能がインストールされている可能性があるため、実際に参照の空白のドキュメントを取得するには、iframeのトリック/メッセージングが必要になる場合があります。
  5. スクリプトを空白のドキュメントに挿入します。
  6. スクリプトを含め、XHRの元のドキュメントからすべてのタグを再挿入します。スクリプトは、新しいコンテキストで再読み込みして再実行する必要があります。
  7. スプラッシュスクリーンを降ろすと、準備完了です。

さて、私はこれを完全に突き刺してオープンソース化するつもりですが、誰かが以前にこのようなことを試したことはありますか?大変な作業になるでしょう。現在使用しているものが棒の四角い岩に相当するものでない限り、車輪の再発明はしたくありません。

4

1 に答える 1

1

または、適切な js shim を使用して現在の URL を新しいウィンドウに書き換えます。

(function() {

var scriptSrc = 'http://example.com/shim.js';
var rq = new XMLHttpRequest; rq.open('get', '', false);
rq.send();
var text = rq.responseText.replace('<head', '<script src="' + scriptSrc + '"></script><head');
var win = window.open();
win.document.open();
win.document.write(text);
win.document.close();

})();
于 2012-05-03T03:02:42.543 に答える