11

ブックマークレットに関するウィキペディアの記事 ( http://en.wikipedia.org/wiki/Bookmarklet ) によると、ブックマークレットの概念は次のとおりです。

Web ブラウザは、タグの href 属性とブックマークに URI を使用します。http:、file:、または ftp: などの URI スキームは、残りの文字列のプロトコルと形式を指定します。ブラウザはプレフィックス javascript も実装します。パーサーにとっては、他の URI とまったく同じです。内部的には、ブラウザは指定されたプロトコルが JavaScript であることを認識し、文字列の残りをJavaScript アプリケーションとして処理して実行し、結果の文字列を新しいページとして使用します。

結果の文字列が新しいページとして使用されることを示しています。つまり、ブラウザが持っている元のDOMはその文字列の影響を受けないということですか? しかし、結果の文字列のみが新しいページとして使用される場合、既存の DOM に新しい DOM 要素を変更または挿入するにはどうすればよいでしょうか? Hello に警告したり、新しい DOM 要素を挿入したりするスクリプトは、実際には何も返さないためです。それらは既存のDOMでちょっと動作します。

現在、Internet Explorer では、Bookmarklets を使用してページ上で JavaScript を実行する以外に、BHO プラグインを作成して、次の方法で挿入できます。

        document = (HTMLDocument)webBrowser.Document; 
        var injectedJS = System.IO.File.ReadAllText("InjectedJS.js");
        var window = document.parentWindow;
        window.execScript("(function(){ " + injectedJS + " })()");

クロムでも同様に、同じことを実現する拡張機能を作成できます。

var s = document.createElement('script');
s.src = chrome.extension.getURL("script.js");
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);

これらはどう違うのですか?私が持っている高レベルの質問は次のとおりです。

  1. これら 3 つのアプローチは、異なる環境で JavaScript コードを実行しますか?
  2. それらのうちの1つに、別のものにはない制限はありますか?
  3. 実行結果がユーザーに表示される方法とブラウザに反映される方法に違いはありますか?
  4. 「JavaScript インジェクション」と「ブックマークレット」という用語に違いはありますか? JavaScript インジェクションは効果であり、ブックマークレットはそれを達成する方法であると私は信じていますが、BHO と Chrome 拡張機能は別のものです。
  5. execScript4 の仮定が正しい場合、BHO のメソッドを使用して JavaScript を実行する方法と、ブラウザーで javascript: プロトコルを使用して JavaScript を実行する方法に違いはありますか?
4

1 に答える 1

12

1. これら 3 つのアプローチは、異なる環境で JavaScript コードを実行しますか?

これら 3 つのメソッドはすべて、ページのコンテキストで JavaScript コードを実行します。これらのメソッドを比較すると、JavaScript コードは同じ環境で実行されていると言えます。

コンテンツ スクリプト (Chrome/Opera/Firefox/Safari) は、Web ページから分離された環境で実行されるため、その観点から見ると、環境はまったく異なります。
BHO は少し異なります。他の拡張プラットフォームとは異なり、拡張機能の言語は JavaScript ではなく、C++、C# などです。JavaScript コードは BHO のネイティブ コードに直接アクセスすることはできません (そのようなものを自分で実装しない限り)。環境は確かに「違う」。

2. それらの 1 つに、別の 1 つにはない制限はありますか?

ブックマークレットはjavascript:...URL であり、それ以上のものではありません。ブラウザー拡張機能は、クロスオリジン HTTP 要求を直接実行したり、永続的なサイトに依存しないストレージにアクセスしたりできます。ブックマークレットで同様の機能を取得したい場合は、外部 Web サービスを使用する必要があります。

ブックマークレットは、ユーザーが手動でアクティブ化した場合にのみアクティブ化できます。これが長所か短所かは、状況によって異なります。

ブックマークレットの最大サイズはURL の最大長によって制限されますが、これはかなり小さいです。<script src>この制限は、ドキュメントにタグを挿入することで回避できます。スクリプトを最初にロードする必要があるため、コードの実行が遅れます。

ブックマークレットは、携帯電話やタブレットのブラウザーを含め、ほぼすべての Web ブラウザーで使用できます (Chrome 拡張機能は、デスクトップ Chromium ブラウザーでのみ使用できます)。

3. 実行結果がユーザーに表示される方法とブラウザに反映される方法に違いはありますか?

いいえ。いずれの場合も、現在のページのコンテキストでコードを実行しています。理論的には、ページはすべての組み込みメソッド (例: Function.prototype.callString.prototype.replace、..) を置き換え、スクリプトの機能を妨害または悪用する可能性があります。
注目に値する可能性があります: Crossrider および Kango 拡張フレームワークは、これら 3 つの方法と同様の方法で Internet Explorer の「コンテンツ スクリプト」機能を実装します。これは、これらのフレームワークを使用して記述された IE プラグインを検出し、API 宣言を傍受し、その機能を悪用するような方法でページを作成できることを意味します。

4. 「Javascript インジェクション」と「ブックマークレット」という用語に違いはありますか? Javascript インジェクションは効果であり、ブックマークレットはそれを実現する方法であると私は信じていますが、BHO と Chrome 拡張機能は別のものです。

ブックマークレットと「挿入されたスクリプト」の間に概念的な違いはありません。この回答のセクション2で説明されているいくつかの実際的な違いがあります。

(「挿入されたスクリプト」とは、Chrome 拡張機能のスクリプトの種類を区別するために私がこの用語を作り出したこの方法 を指していると思います。Opera 12 と Safari は両方とも、この用語を「コンテンツ スクリプト」に使用します)。

5. 4 の仮定が正しい場合、BHO の execScript メソッドを使用して JavaScript を実行する方法と、ブラウザーで javascript: プロトコルを使用して JavaScript を実行する方法に違いはありますか?

前述の違いに加えて、いいえ。

于 2013-11-13T13:52:48.660 に答える