GreaseMonkey

こりゃ面白い。
ページ内に埋め込んだメタデータを解釈させることで、WebでJava5のAnnotationや.NETのAttributeのような属性プログラミングもできる。

これが普通のJavaScriptと違うのは、スクリプトを適用させる順番になるべく依存しないようなコードを書くように気をつけないといけないことだ。同じページに対してすべてのスクリプトが実行されるからだ。たとえばDOMツリーパーズで3個目のIMGを〜とかいうのは弱いコードになる。そしてこの同じページに対して、独立して書かれた多数のスクリプトを同時適用できるというところが、このGreaseMonkeyの一番の特徴なのだ。

GreaseMonkey User Scriptの例:

// ==UserScript==
// @name Alt Extractor
// @namespace http://d.hatena.ne.jp/bellbind/userscript/altextractor
// @description Extract Alt Attribute in all img elements.
// @include *
// @exclude *.js
// ==/UserScript==

(function () {
  var imgs = document.evaluate(
    '//img[@alt]',
    document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null
    );
  for (var i = 0; i < imgs.snapshotLength; i++) {
    var img = imgs.snapshotItem(i);
    var alt = img.getAttribute("alt");
    var text = document.createTextNode('(' + alt + ')');
    img.parentNode.insertBefore(text, img.nextSibling);
  }
})();

やってることは、imgタグのalt要素をimgの後ろにテキストで出しているだけです。User ScriptではXUL関数が呼べている模様。

このコメント部分はメタデータです。なくてもOKですが、その場合、インストール時にinclude,excludeの設定ダイアログが出ます。include、excludeの優先順序はわかりませんが、上の書き方だと.jsファイルはスクリプト実行対象外になります。

この処理が開始されるのは、文書を読み込んでDOMツリーが出来上がった直後です。そのあとonload、埋め込みscriptなどが実行されます。

あとfunction外部に定義を書くことは無理のようでした。しかし、functionの中ならクラスなどの定義も自由に書けますね。