マークアップビルダ、存在しないメソッド2005年09月16日 15時30分

JavaScript、マークアップビルダ、存在しないメソッド」(Collection & Copy) を読んで。そういえば Firefox 1.5 には XMLContentBuilder というのがあった。XTF の一部として提供されているのだが、これを使うと (といっても XPCOM コンポーネントなので通常の Web 上では使えないが) 例えば table の作成は以下のように書ける、と思う。

var data = [["A1", "A2"], ["B1", "B2"]];
var b = Components.classes["@mozilla.org/xtf/xml-contentbuilder;1"]
                  .createInstance(Components.interfaces.nsIXMLContentBuilder);

b.setDocument(document);
b.setElementNamespace("http://www.w3.org/1999/xhtml");

b.beginElement("table");
  b.attrib("summary", "サンプルの表");
  b.beginElement("tbody");
    for (var i = 0; i < data.length; i++) {
      b.beginElement("tr");
        var cells = data[i];
        for (var j = 0; j < cells.length; j++) {
          b.beginElement("td");
            b.textNode(cells[j]);
          b.endElement(); // td
        }
      b.endElement(); // tr
    }
  b.endElement(); // tbody
b.endElement(); // table

document.body.appendChild(b.root);

beginElementendElement で囲まなければならないっていうのがちょっと泥臭いような気もするが、こうすることで途中に文をいくらでも挟めるのは便利。

それから、実は JavaScript でも存在しない関数を呼ぶことはできる。SpiderMonkey (Firefox などに使われている JavaScript エンジン) でしか利用できないのだが、__noSuchMethod__ というのがそれだ。__noSuchMethod__ というメソッドを定義しておくことによって、存在しないメソッドが呼ばれたときは代わりにそれが呼ばれるようになる。(参考: Bug 196097 Attachment 134673)

Object.prototype.__noSuchMethod__ = function (name, args) {
  alert("存在しないメソッド " + name + " が呼ばれました。");
};

というわけでこれを使えばこのようなマークアップビルダ (Firefox など Gecko 系専用) が可能になる。

var b = new MarkupBuilder();
b.p(null,
    "わからないことを ",
    b.a({href: "http://www.google.co.jp/"}, "Google"),
    " で調べる。");
<p>
  わからないことを
  <a href="http://www.google.co.jp/">Google</a>
  で調べる。
</p>

コメント

_ brazil ― 2005年09月16日 22時30分

うわ~、勉強になりました! やっぱりあるんですねぇ。実装依存だと実際の利用は少し限られますが。問題自体は、JSONを使うのが最も良いということで進めております。JSONをXMLやHTMLやSwingなどのビルダに投げる感じでしょうか。他エントリも読み、勉強させていただきますm(_ _)m。(投げ銭できないなぁ、ボソリ...)

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
「ハイパーテキストマークアップ言語」をアルファベット4文字でいうと?

コメント:

トラックバック

このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2005/09/16/77037/tb

_ Young risk taker. - 2006年05月20日 05時55分

JavascriptでのDOM生成について、調べていたところ、マークアップビルダ、存在しないメソッドの記事を見つけて、SpiderMonkey以外のJavascript実装のブラウザでも汎用的に使えるように、実装してみました。