Kanasan.JS JavaScript 第 5 版読書会 #6 ― 2008年11月21日 21時40分
Kanasan.JS JavaScript 第 5 版読書会 #6 に行ってきました (当日のチャットログ、参加者のブログ一覧)。今回は 14 章「ブラウザウィンドウの制御」から 16 章「CSS とダイナミック HTML」の途中まで読み進めました。
タイマーの仕様 (14.1、p. 282)
setTimeout などのタイマーはブラウザが独自に実装したもので、標準化された仕様は存在しません。HTML 5 の草案には一応含まれているものの、独立した仕様に移すことが示唆されています。かといって、その場合の受け皿となるであろう W3C WebApps WG にもはっきりとした動きは見られず (Apple の人から高精度タイマーの提案が出ていましたが)、タイマーの標準化がどうなるのかよくわかりません。
Navigator オブジェクト (14.3.3, p. 289)
Navigator オブジェクトを基にブラウザを判別して動作を変えるのはよくないという話。ただし、例外としてあるブラウザの特定バージョンのみに存在するバグに対処する場合が挙げられています。あるメソッドが存在しないというのならまだいいのですが、メソッドは存在するけど動作が異なるとなったら苦労しますからね。
window.open の引数 (14.4.1, p. 292)
window.open メソッドは第3引数にウィンドウの表示情報などを渡せますが、これは "width=400,height=350" といった文字列を使って指定します。これに対して、文字列だといかにも格好悪いから、オブジェクトリテラルを使って { width: 400, height: 350 }
のように指定できないのかという声がありました。しかし、window.open メソッドが導入されたのが JavaScript 1.0 (NN 2、このころは JavaScript の言語機能とブラウザのオブジェクトモデルが分離されていませんでした)、対してオブジェクトリテラルの導入が JavaScript 1.2 (NN 4) と、歴史的経緯で文字列指定になっていると思われます。
window のメソッドと document のメソッド (14.4.2, p. 293)
window オブジェクトにも document オブジェクトにもそれぞれ open、close メソッドが存在しますが、それらの動作は異なります。open() とだけ書いた場合、外部ファイルまたは script 要素内にスクリプトを書いていれば、グローバルオブジェクトである window オブジェクトの open メソッドと解釈されます。しかし、<input onclick="open()" />
のように HTML のイベントハンドラ属性にスクリプトを書いた場合、スコープチェーンに document オブジェクトが含まれ、document オブジェクトの open メソッドと解釈されることがあります。このような場合には、明示的に window オブジェクトを指定しなくてはいけません。
window.onerror (14.7, p. 300)
window.onerror に関数を設定すると、すべてのプログラムの最上位に try-catch 文があるかのように振舞います。例外が発生したがそれより上位に try-catch 文がないときに、onerror に設定した関数が呼び出されるのです。とはいえこれは JavaScript に try-catch 文がなかったころの遺物であり、try-catch 文が広く使える今日では利用する機会はほとんどないでしょう。
frames プロパティ (14.8.2, p.303)
その文書が含むフレームの集合を得るために frames プロパティがありますが、実は Firefox、IE、Safari では window オブジェクトの frames プロパティはその window オブジェクト自身を指します。なので、window.frameName
として参照できるものは window.frames.frameName
としても参照できますし、window[i]
で i 番目のフレームを取得可能。さらには frames.setTimeout()
なんてこともできます。
要素への名前付け (15.3.1, p. 317)
HTML には name 属性が存在しますが、その意味は要素によって異なります。
- 要素の名前を表すもの (a 要素、img 要素、form 要素など)
- フォームコントロールの名前を表すもの (input 要素、textarea 要素、select 要素、button 要素)
このうち、1 については今や name 属性を使う必要はなく、id 属性を使うべきです。
getElementsByClassNameメソッド (15.6, p. 335)
Firefox 3、Safari 3.1、Opera 9.5 以降では getElementsByClassName メソッドが実装されていますが、これは引数として指定されたクラス名をすべて含むクラス名を持つ要素を取得します。引数として指定されたクラス名と一致するクラス名を持つ要素のみではありません。getElementsByClassName("a b")
とすれば、class 属性の値が "a b"、"b a"、または "a b c" などである要素は取得できますが、class 属性の値が "a" である要素は取得できません。
JavaScript のソートアルゴリズム
JavaScript のソートアルゴリズムは実装依存であり、安定性も要求されません。SpiderMonkey の場合、バージョン 1.7 以下 (Firefox 2 以下) ではヒープソートを使っていましたが、やはり安定なソートのほうがいいとのことでバージョン 1.8 (Firefox 3) ではマージソートに変更されました。JavaScriptCore では場合によって選択ソート、マージソート、クイックソートのいずれかが、V8 ではクイックソートと挿入ソートの組み合わせが使われるようです。
unicode-bidi CSS プロパティ (16.1, p. 365)
unicode-bidi CSS プロパティ (bidi は biderectional の略か?) は、Unicode の双方向書字アルゴリズムに関する制御文字の扱いを指定するためのプロパティです。双方向書字アルゴリズムに関しては HTML にも bdo 要素があります。
「控えめな JavaScript」? (16.2.2, p. 375)
CSS を使った影つきテキストの生成が「控えめな JavaScript」の例として出てきますが、これは同じ内容を持つ要素を CSS の位置指定で重ねるというもので、同書で控えめな JavaScript の 3 番目の目標として挙げられていたアクセシビリティを低下させないということに反する気がします。音声ブラウザの例を取り上げなくとも、コピーアンドペーストの際などに意図した結果が得られなくなりますし。
雑感
思い起こせば 1 年前、第 1 回 Kanasan.JS に参加したのをきっかけにさまざまな人と出会え、関西での活動の場を広げられたと思います。その Kanasan.JS を立ち上げた Kanasan さんが関東に引っ越すとのことで、今回を最後に運営スタッフから抜けることになってしまいました。他の運営スタッフの方々が後を引き継ぐとのことですが、全員で同じものを読み進めていくという勉強会のスタイルを確立し、ここまで続けてこられたのはやはり Kanasan さんの力によるところが大きいでしょう。これまで本当にありがとうございました。
コメント
トラックバック
このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2008/11/21/3969645/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。