ブックマークレットに関するウィキペディアの記事 ( 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);
これらはどう違うのですか?私が持っている高レベルの質問は次のとおりです。
- これら 3 つのアプローチは、異なる環境で JavaScript コードを実行しますか?
- それらのうちの1つに、別のものにはない制限はありますか?
- 実行結果がユーザーに表示される方法とブラウザに反映される方法に違いはありますか?
- 「JavaScript インジェクション」と「ブックマークレット」という用語に違いはありますか? JavaScript インジェクションは効果であり、ブックマークレットはそれを達成する方法であると私は信じていますが、BHO と Chrome 拡張機能は別のものです。
execScript
4 の仮定が正しい場合、BHO のメソッドを使用して JavaScript を実行する方法と、ブラウザーで javascript: プロトコルを使用して JavaScript を実行する方法に違いはありますか?