ブックマークレットは表示しているページと変数のスコープを共有している

2006年8月1日(火) 23時25分 by level
B ?

最近ブックマークレットをいじっていて気が付いたのですが、ブックマークレットは表示しているページと変数のスコープを共有しているんですね。その道の専門家なら常識なのかもしれませんが、ちょっと予想外の現象だったので驚きました。

(実際には変数のスコープというより、実行環境というのかそういうもっと大きな意味での共有だと思われますが用語が分らないのでスコープとしておきました)

ブックマークレットというのはブラウザのブックマークに url ではなく JavaScript のコードを登録したものです。JavaScript のコードが変数のスコープを共有しているというのは、ブックマークレットやページ内の JavaScript 同士で相互に変数を参照できてしまうということです。以下に例を示します。

サンプルA: javascript:var fx="Mozilla Firefox";

サンプルB: javascript:alert(fx);

サンプルC: javascript:alert(loadingImage);

Firefox であれば、上のリンクをパーソナルツールバーにドラッグ&ドロップすればブックマークレットとして登録できます。

これをサンプルA、サンプルBの順に実行(クリック)すると、サンプルAで登録した変数 fx の内容が、サンプルBでダイアログに表示されます。サンプルA実行終了後も、そこで定義された変数 fx が残っており、全く別のブックマークレットから参照できてしまうということです。これはブックマークレットとして実行した場合も、ページ上のリンク上で実行した場合も動作としては同じです。サンプルAをサイトXで、サンプルBをサイトYで実行した場合はダイアログは表示されません。これは、ブックマークレットがそのサイトのスコープ内で実行されているからだと思われます。このあたりの動作は Firefox だけでなく、Opera や IE でも同じでした。

一方、えむもじら内でサンプルCを実行すると、ダイアログが表示されます。ここで表示しいている loadingImage という変数は、えむもじら内で使用している、lightbox.js 内で定義されたものです。試してはいませんが、ページ内の JavaScript からブックマークレットの変数を参照することも可能でしょう。

ブックマークレットなんか、実行が終われば、その痕跡も全てなくなってしまうのかと思いきや、変数やおそらくは関数などもそれを実行したページ上に残っているということは意外でした。ブックマークレットで安易にパスワードやアカウント情報を扱うのは避けたほうがよさそうです。もしくは、最後に変数をクリアしておくべきでしょう。

一方、このことを積極的に使用する方法もあるかもしれません。複数のブックマークレットで一つの機能を実現するとか、共通処理のブックマークレットを実行後、個別処理の複数のブックマークレットを実行するとか、あるいは非常に長いスクリプトを単に分割するとか。でも、1回クリックと、2回クリックとでは使い勝手に大きな差がありますが。

コメント (2)

1 8/02 10:32 Seacolor
(c1) [2006/08/02 10:32:29] by Seacolor

この問題を避けるため、bookmarkletは無名関数を使うように推奨されていますね。
こちらのページが詳しいです。

Bookmarklet - ブックマークレットを作成する際のポイント
http://www.teria.com/~koseki/memo/bookmarklets/tips.html

2 8/02 12:45 level@管理人
(c2) [2006/08/02 12:45:56] by level@管理人

なるほど。
有益な情報ありがとうございます。

トラックバック

トラックバックは検索対象外です。

この記事にリンクしているページ < >

  1. データがありません。