2009-12-01
iPhone Safari での XHR/iframe のロードはどちらが速いか
- 答え:特に iframe を使う理由が無ければ XHR をつかえ(約2.5倍速)
 
手元のページでやってみた。環境は3G + WiFi。
- XHR の readyState 4, status 200 になるまでと iframe の onload 発動まで
- XHR 平均約700ms
 - iframe 平均約1800ms
 
 
また結果を XHR のほうは div.innerHTML = req.responsText 的な方法でノードツリー作成、iframe の場合は iframe.contentDocument を利用して、querySelector で必要なノードを取得、という場合
- XHR(innerHTML) 約30ms
 - iframe 約50ms
 
とこちらも XHR の方が実機で速い。あと iframe は history.back にどんどん iframe でロードした副作用も発生してしまうので無難に XHR の方が良い。
ちなみに HT-03A(Android 1.6) のブラウザでは
- XHR 約2000ms
 - iframe 2000ms-8000ms
 
とXHRのほうだと安定するがiframeのほうだと安定しない感じになった。むーん。
iframe を使った方が良い場合は、ロード先のデータの JS実行(document.write 等)をきちんと行った DOM ノードがとれるので、汎用的で速度が気にならないような場合は iframe にもメリットがある。
Android ブラウザの JS でテキストノードに utf8 文字を入れると文字化ける
- 外部から utf8 の JS (もちろんcharset指定してる)を読み込む
 - その JS 内部で createTextNode('マルチバイト') してつっこむ
 - バケラッタ
 
仕方ないのでユニコードエスケープシーケンスにして文字化けを回避した。ちなみに Firebug などで
"マルチバイト".quote();
copy("マルチバイト".quote()); // クリップボードにコピー
するとエスケープシーケンスが簡単に解る。BENRI-。いつも String#quote の名前を忘れるのでメモっておく。
localStorage 使い始めてハマりがちな罠
localStorage.bool = false;
alert(localStorage.bool); // false
if (localStorage.bool) alert(localStorage.bool); // false が表示される
localStorage.ary = ['a', 'b', 'c']; // この時の戻り値は ['a', 'b', 'c']
localStorage.ary[0]; // => a
localStorage.ary instanceof Array; // => false
localStorage は文字列しか格納できないので自動で型変換が行われる。console.log 等で表示すると一見 false が出るのであれれ?となる。なので消したいときはきちんと delete 演算子か removeItem(key) を使おう!