Secrets of the JavaScript Ninja 10章を読んで来た
開催からずいぶん時間が経ってしまった(7/2にやりました^^;)のですが、10章(Strategies for Cross-Browser Code)を読みました!
前回の計画の通り、7,8,9章はライブラリ作者向けの内容ということで後回しにしました。
この章はほとんどコードが出てこないので、予習がしんどかったです。。。
予習はしんどかったですが、こういうことに気をつけるんだな、ということが分かったので良かったです。
以下、まとめです。
- サポートすべきブラウザ
- 最新のバージョン(Current)、1つ前(Previous)、1つ後(Next)が一般的だそうです.
- 例外としてIEは6.0もサポートの必要あり...
- 開発時に注意すること
- どこまでの範囲、サポート対象とするかのバランスが大事.
- ブラウザのバグ
- 他の機能と同等になるようにシミュレーションしてしまう.
- 外部コードとマークアップ
- Prototypeの変更やHTML要素をjsでコントロールするときに注意すること
- ObjectオブジェクトのPrototypeにプロパティを生やすと、for inループを使ったときにhasOwnPropertyしなきゃいけなくなる
- formタグのidに"form"と名付けたり、submitボタンのidに"submit"と名付けたりすること.
- さすがにこれはやらないと思いますが...
- Prototypeの変更やHTML要素をjsでコントロールするときに注意すること
- とても古いブラウザへの対応
- IE4とか、とても古いブラウザの場合、cssやjsは使わずに、HTMLだけのページを表示してあげる対応方法
- ブラウザのバグ!?
- ブラウザのバグなんだけど、バグったままの挙動で、今までエンドユーザが実装してきてしまったので、修正すると、既存のコードが動かなくなるため直せない.
例として、adoptNodeというメソッドの話が載っていました.
- Regressions(回帰!?と訳せば良いのでしょうか...)
function attachEvent( elem, type, handle ) { // bind event using proper DOM means if ( elem.addEventListener ) elem.addEventListener(type, handle, false); // use the Internet Explorer API else if ( elem.attachEvent ) elem.attachEvent("on" + type, handle); }
が載っていました.
if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
-
- またまたIEですが、input要素の属性を変更できないようにする
if ( name == "type" && elem.nodeName.toLowerCase() == "input" && elem.parentNode ) throw "type attribute can't be changed";
なお、この例は実際にjQueryのコード内で使われています.
- Object Detection
if ( typeof document !== "undefined" && (document.addEventListener || document.attachEvent) && document.getElementsByTagName && document.getElementById ) { // We have enough of an API to work with to build our application } else { // Provide Fallback }
というコードも紹介されていました.Fallback部分には,
- 機能を減らして、そのブラウザで使えるjsの機能だけ使う
- jsなしのページへリダイレクト
- 簡素なバージョンのサイトへリダイレクト(Gmailのような簡易HTMLページ)
のような処理を書くとよいそうです.
- 機能をシミュレートする
- あるブラウザでは実装されていない機能を実装してしまう方法です.
- テストできない、難しい場合
- 実装時の注意点
次は12章( DOM Modification )です!