マークアップビルダ、存在しないメソッド ― 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);
beginElement
と endElement
で囲まなければならないっていうのがちょっと泥臭いような気もするが、こうすることで途中に文をいくらでも挟めるのは便利。
それから、実は 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分
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。
トラックバック
このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2005/09/16/77037/tb