ものすごく意味のないコード
jQueryのこと書いてたら思いついた。
既出かな?
$(function(){
alert($($($($($($($(‘#box’).get()).get()).get()).get()).get()).get()));
});
さて、結果はHTML Elementでしょうか?jQueryオブジェクトでしょうか?
答え:どうでもいい(笑)
一応、jQueryオブジェクトです。
jQueryのこと書いてたら思いついた。
既出かな?
$(function(){
alert($($($($($($($(‘#box’).get()).get()).get()).get()).get()).get()));
});
さて、結果はHTML Elementでしょうか?jQueryオブジェクトでしょうか?
答え:どうでもいい(笑)
一応、jQueryオブジェクトです。
少し前に、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(特に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より早ければいいかな。
IE8が出てしばらく経ちますが、やはりIEの独自仕様に悩まされることは多々ありますよね。
addEventListenerがattachEventだったりgetAttribute(‘className’)だったりnew ActiveXObjectだったりで・・・。
「Firefoxだけで動けばいい」という開発だったら工数は3分の1になりそうな感じです(ライブラリ未使用で)。
とはいえ、最近はIEの挙動不審が可愛く思えてきました。
「手間のかかる子ほど可愛い」とはよく言ったものですが、
ここまで手間がかかると逆に面白いくらいです。
もしもこの世界にIEしかなかったとしたら、それはそれで面白いことになりそうな気がしますね。
JavaScriptの至上命題は「クロスブラウザ」、これに尽きます。
いろいろと動くアプリケーションは簡単に設計できますが、「どのブラウザでも動く」アプリケーションは難しい。
本当に難しい。canvasなんて使った日にはもうお手上げでしょうか。
「IEの実装差分をどれだけ吸収できるか」が良いJavaScripterなのかもしれません。
・・・さすがにIE5とかは手がつけられませんが(笑)
自分のフレームワークを使っていて、どうにもGoogleChromeだけが動かない事態が発生しました。
IEだけ動かない、というケースには慣れっこですが(笑)、Chromeだけ動かないのは少し驚きました。
var e = hogehogeGetElement();
var native = e.hugahuga();
みたいなコードが動かなくて困りました。他のブラウザでは全部動いているのに・・・。
何がダメなんだろう、と試行錯誤の末、変数名を変えたら動いた。
var n = e.hugahuga();
「native」ってChromeでは予約語なのかな?この変数を定義すると動かないんですよね。
ちょっと稀な経験をしてしまいました。