Latest Publications

IEほど手間のかかるブラウザはないね。

IE8が出てしばらく経ちますが、やはりIEの独自仕様に悩まされることは多々ありますよね。

addEventListenerがattachEventだったりgetAttribute(‘className’)だったりnew ActiveXObjectだったりで・・・。

「Firefoxだけで動けばいい」という開発だったら工数は3分の1になりそうな感じです(ライブラリ未使用で)。

とはいえ、最近はIEの挙動不審が可愛く思えてきました。

「手間のかかる子ほど可愛い」とはよく言ったものですが、

ここまで手間がかかると逆に面白いくらいです。

もしもこの世界にIEしかなかったとしたら、それはそれで面白いことになりそうな気がしますね。

JavaScriptの至上命題は「クロスブラウザ」、これに尽きます。

いろいろと動くアプリケーションは簡単に設計できますが、「どのブラウザでも動く」アプリケーションは難しい。

本当に難しい。canvasなんて使った日にはもうお手上げでしょうか。

「IEの実装差分をどれだけ吸収できるか」が良いJavaScripterなのかもしれません。

・・・さすがにIE5とかは手がつけられませんが(笑)

「native」はGoogle Chromeでは予約語だったみたい。

自分のフレームワークを使っていて、どうにもGoogleChromeだけが動かない事態が発生しました。

IEだけ動かない、というケースには慣れっこですが(笑)、Chromeだけ動かないのは少し驚きました。

var e = hogehogeGetElement();

var native = e.hugahuga();

みたいなコードが動かなくて困りました。他のブラウザでは全部動いているのに・・・。

何がダメなんだろう、と試行錯誤の末、変数名を変えたら動いた。

var n = e.hugahuga();

「native」ってChromeでは予約語なのかな?この変数を定義すると動かないんですよね。

ちょっと稀な経験をしてしまいました。

ドキュメントのレンダリングモードを知る方法

最近はそれほどでもないですが、IE6などでは「後方互換モード」になるケースが多々あります。

DOCTYPEスイッチだとか、いろいろな要因で後方互換モードになってしまうのですが、ここいらで簡単にチェックできる方法があるのでご紹介したいと思います。

javascript:alert(document.compatMode);

こんなJavaScriptをロケーションバーに打ち込んでみてください。ダイアログが出てきます。

CSS1Compat

もしくは、

backCompat

なんてアラーとが出ますね。「CSS1Compat」なら標準モード、「backCompat」なら後方互換モードでレンダリングされている、という感じです。

最近のモダンブラウザなら大概はCSS1Compatでしょうが、IE6等でレイアウトが決まらないときにはチェックしてみるのもいいかも知れませんね。

・・・知ったからどうなの?というのは別問題ですが><参考までに。

速度の問題か好みの問題かな。

最近新しく発刊された某書籍でJavaScriptで要素のCSSの値を数値で取得するところが気になった。

みなさんは普段どうやられているのかわかりませんが、要素elmを取ったとして、widthの値を数値で取る時、

var width = parseInt(elm.style.width)

と私はやります。書籍では、

var width = eval(elm.style.width.replace(‘px’, ”))

ってやってた。う~ん、まぁこの方法もアリだとは思うんですけど。

前者だとisNaNのチェックが必要になる分手間かな、とも思ったのですが、後者は結局undefinedのチェックをしないといけないわけで。どっちも一緒かもしれないですね。

時間があったので1000回繰り返す速度計測してみた。どうでもいいだろうけど。

window.onload = function() {
var div = document.getElementById(‘test’), w, w2;
var st = (new Date()).getTime();
for (var i = 0; i < 1000; i++) {
w = parseInt(div.style.width);
w = (isNaN(w)) ? div.style.width : w;
}
var ed = (new Date()).getTime();
var time = ed – st;
alert(‘result : ‘ + w + ‘ , type : ‘ + typeof w + ‘ , time : ‘ + time);
var st2 = (new Date()).getTime();
for (var i = 0; i < 1000; i++) {
w2 = eval(div.style.width.replace(‘px’, ”));
w2 = (typeof w2 == ‘undefined’) ? ” : w2;
}
var ed2 = (new Date()).getTime();
var time2 = ed2 – st2;
alert(‘result2 : ‘ + w2 + ‘ , type : ‘ + typeof w2 + ‘ , time : ‘ + time2);
}

どっちも無ければ空値を返すようにしました。結果は表にするのも面倒なので大体の平均値を。

Firefox3.5   前者 : 6~8ms 、 後者 : 9~14ms

IE8              前者 : 15~16ms(max 31ms) 、 後者 : 15~16ms(max 31ms)

2つしかやってないけど、ややparseIntの方が早いかな?IEはどっちでも同じみたい。意味不明。

好みの問題だと言えばそうかもしれませんが、コンパイラを起動させるevalはあまり使うべきではないかと思います、個人的に。evalなんてresponseTextをJSONに変換する時くらいしか使わないけどなぁ。セキュリティ面でもよろしくない、と「JavaScript:The Good Parts」でも書かれてたし。

parseIntも遅いだろうけど、eval + String.replace()よりは早いってことかな。IE以外は。

CSSセットや値の取得なんて一番頻繁にやる部分だからできるだけ高速化しておきたいところですね。

CodeIgniter読書会のキックオフセミナー開催

今週の土曜日になりますが、PHPフレームワーク「CodeIgniter」の読書会を始めるためのキックオフセミナーを開催するに至りました。

実際は時間が1時間も無いため、具体的に突っ込んで読書を進めていくことはできないため、読書会の展望や進め方、各都市での開催予定について、お話します。

CakePHPなSymfonyなどの他フレームワーク使いの方々も振るってご参加ください。他のフレームワークを勉強することで、色々な考え方やアイディアも浮かんでくるんではないでしょうか?

セミナー時間割表
http://www.ospn.jp/osc2009-nagoya/modules/eventrsv/?id=1&noform=1

セミナー会場
http://maps.google.co.jp/maps/ms?ie=UTF8&hl=ja&msa=0&msid=108784144899608752188.0004497afc6c98eded884&ll=35.141739,136.928444&spn=0.012283,0.017166&z=15&iwloc=0004497b2056b8feb2e1f&source=embed

参加費:無料

CodeIgniter読書会ML
http://groups.google.co.jp/group/codeigniter-reading

アマゾンのCodeIgniter徹底入門(¥3990)
http://www.amazon.co.jp/dp/4798116769/