Latest Publications

ものすごく意味のないコード

jQueryのこと書いてたら思いついた。

既出かな?

$(function(){

alert($($($($($($($(‘#box’).get()).get()).get()).get()).get()).get()));

});

さて、結果はHTML Elementでしょうか?jQueryオブジェクトでしょうか?

答え:どうでもいい(笑)

一応、jQueryオブジェクトです。

7バイトでIEかどうかを判定する方法

少し前に、JScriptの条件付きコンパイルを使ってIEを判定する方法が流行りました。

var IE = /*@cc_on!@*/false;

とかやる方法ですね。

ただ、条件付きコンパイルは遅くなるだとか(信憑性は不明ですが)聞いたので使ってませんでした。

で、タイトルの方法。こう書くそうです。

var IE = !+”\v1″;

これで、IEはtrue,それ以外はfalseとなります(Opera,Safari,Firefox,Chromeで検証)。

swfObject.jsのソースを読んでたらこんなことしてるもんだから、もとネタを見たらちゃんと解説もしてありました。ちょろっと見たことを書いてみます。

→もとネタ http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html

どうやら、\vは通常のブラウザはvertical space(改行つきスペース?)の文字として認識するようで、

var IE = !(+

1

)

と認識するようですね。で、1の否定で0だからfalse。うん、納得。

しかし、IEは\vは文字列として認識するようで、

var IE = !(+v)

カッコ内の結果をisNaNしてtrueになるようです。

こんなのよく考えたなぁ、と関心しながら自分のフレームワークに取り込みました。

indexOfでuserAgent判定してたから、その分早くなったかなぁ。

・・・でもこれってJScriptの解釈のせいなのかな?IE9からできなかったりして。

そうなったら元に戻すしかないね。

セレクタ検索系でIEが遅くなる理由

セレクタ検索を独自に実装されている方は多いと思いますが、どうにもIE(特にIE6、7)が遅いと感じることはありませんか?

もちろん、JScriptのエンジン自体が遅いからなのですが、それ以外にもちょっとしたことで速度が改善したりします。

特に私が感じたのは、「NodeList」のループの部分です。

var list = document.getElementsByTagName(‘p’);

for (var i = 0; i < list.length; i++) {

// do something

};

と書くことが多いかと思います。しかし、これは遅いです。

var list = document.getElementsByTagName(‘p’), len = list.length;

for (var i = 0; i < len; i++) {

// do something

};

これだと数倍早く動きます。600回くらいのループで検証しました(内部処理は++countくらいで)が、

前者はIE6で約500ms、後者だと20数msでループが完了しました。

NodeListはSnapShotではなくLiveなものだから、ループの際に逐一「.length」の変化を見てるのかな?

もしくはNodeList.lengthのアクセス自体が遅いのか。

どちらかはわかりませんが、とにかくループ前にNodeListの長さを変数に格納してループすると

早くなるようです。

「数msくらい気にしない」、もしくは「IEはこんなもん」と思うのならさほど気にしなくてもよさそうですが、検索が遅いとその後の処理も遅くなってしまいますよね。

※どうもセレクタ検索を書くと速度のチューニングにハマって仕事にならないですね。

とりあえずトータルではjQueryより早ければいいかな。

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では予約語なのかな?この変数を定義すると動かないんですよね。

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