Mozilla Party JP 8.0 に講師として参加させていただきました。以下はプレゼンテーション用のスライドです。
OnpenOffice.org 2.0 の Impress を使って作ったのですが、私のノート PC のディスプレイ接続がうまくいかず、お借りしたマシンに入っていた OpenOffice.org 2.1/2.2 ではなぜか実行途中にフリーズするので、PDF にエクスポートしたものを用いました。
また、発表は 25 分の枠だったのですが、最初に練習したときは 1 時間かかってしまい、話す内容をいろいろと削ったものの、結局枠ぎりぎりまで使い切ってしまって、質疑応答の時間をとることができませんでした。もし何か聞きたいことがあったという方がいらっしゃれば、このコメント欄にお願いします。
それから、発表中に話したこともそうでないことも含め、上記のスライドに関する補足をいくつか挙げておきます。
::
の前に指定した変数は、その文字列化した値が使われます。ですから、名前空間 URI を扱うだけなら、ns = "http://example.org/"
のように、Namespace オブジェクトを使わなくともかまいません。ただし、名前空間接頭辞の情報も保持したいといったときは、Namespace オブジェクトを使う必要があります。method()
を評価したとき、ECMAScript ではスコープチェーンを順にたどり、method という名前のプロパティを持つオブジェクトを探します。しかし、x が method という名前の子要素を持っていなければ、x は method という名前のプロパティを持たないことになってしまいます。そのため、list.(method())
では期待通りに動かない場合があります。関数内でデフォルト名前空間を指定した場合、非修飾名を解決するのにデフォルト名前空間が使われない場合があります。たとえば、以下のコードでは "Default Namespace" と表示されるはずですが、"No Namespace" と表示されてしまいます。
var ns = new Namespace("http://example.org/");
(function () {
default xml namespace = ns;
var x = <a>
<b>Default Namespace</b>
<b xmlns="">No Namespace</b>
</a>;
print(x.b); // No Namespace
})();
この問題は、スコープチェーンを深くすることにより解決できます。
(function () {
...
with ({}) print(x.b); // Default Namespace
})();
(function () {
...
(function () { print(x.b); })(); // Default Namespace
})();
また、スコープチェーンを深くする操作があれば、それが非修飾名によるプロパティアクセスのあとであっても、解決することがあります。
(function () {
...
print(x.b); // Default Namespace
with ({});
})();
セコメントをする