2012-05-12 5 views
4

Bug with Chrome's localStorage implementation?は、仕様を非常によく説明し、OperaとIE9の動作がどのように異なるかについて説明しています。ブラウザ間で異なる「ストレージ」イベント動作をどのように考慮しますか?

しかし、今は何ですか?

本当に台無しそれは別だとき、ブラウザ上の一つの方法であることを、実装に依存している私のコード(任意のコード)になります。

は、どのように私は、イベントがそれを呼び出し、ウィンドウの上に発射されているかどうかを知るためにテストしていますか?私が理解することができ

唯一のものは待って、イベントがそれを呼び出すか、ウィンドウに発射されたかどうかを確認し、それがない場合は何かをするのsetTimeout()を使用することです。しかし、これは、ストレージイベントがすぐに連続して呼び出されたときに、ひどいバグを引き起こす可能性があります。私の場合は

私はそれを呼び出す1を除くすべて、すべてのウィンドウのために発射イベントをする必要はありません。これを仕様に正しく実装しているChromeでは、これはlocalStorage.setItem()に追加した後に追加機能を追加するだけですが、IE、Firefox3.6、Operaでは効果的にその機能を2回実行します。私はまた、ブラウザに基づいて別のコードを持つことができますが、私はブラウザのバージョンではなく互換性をテストする必要があります。

それらすべてに同じように処理されるイベントを持っているのlocalStorageをサポートした「パッチ」すべてのブラウザにする方法はありますか?

+1

互換性テストのように思えるのは、一度 '一瞬で'一意のIDを含むキーを書くことで可能です。タイムスタンプを作成し、それがいつ戻ってくるかを記録します。イベントが戻ってこない場合は、コードを先に進め、ストレージを変更するときにコードをローカルに起動する必要があります。さもなければその論理をバイパスしてくださいここの荒いアイデア...答えではない。 – joshp

+1

うん。私もそのことを考えていましたが、私はまた「おそらくバギーであり、良いことではありません」の下にあります。私は、このソリューションは、JSONの解析とブラウザのサポートなしにブラウザをサポートするパッチに似ている必要がありますが、この場合はlocalStorageイベントを上書きする必要があると思います。しかし、私はそのようなことをやってどこから始めるべきか分かりません。私は、現在のコードがどのように見えるかを知ることさえできず、もしそれが可能であれば、私が上書きする必要がある機能を把握することさえできません。 – sadtaco

+0

あなたが豚(邪悪なブラウザ)と闘うとき、あなたは汚れます。もし存在しなければ、そういうライブラリを書くのは楽しいでしょう。問題は最高の能力テストです。もし私が見つけたら、私は答えを投稿します。 – joshp

答えて

0

私はこれについて興味があり、いくつかのjsストレージライブラリを見ました。これまでストレージイベントをサポートしていたのは、YUI 2 Storage Utilityです。それは見て、それがブラウザ間の動作を正常化するかどうかを確認することは興味深いでしょう。 YUI3に基づいたライブラリもあり、面白そうに見えて、変更イベントと保存準備完了イベントを宣伝しています。

YUI 2 Storage

YUI 3 based Storage Lite

これらはあなたが望むよりも多くの依存関係を含むことができます。彼らはまた、より簡単に問題を解決する方法を学ぶ方法を提供するかもしれません。

ものするライブラリはまた、HTML5形式のストレージを提供していないブラウザをどうするか、問題に取り組みます。

+0

すでにjQueryとアンダースコアを使用しているときに別のライブラリを追加するのは嫌です。そのAPIは大丈夫です。それはストレージが変更されたときのクロスウィンドウイベントを含んでいるようですが、これはここで少し問題です。私は単にlocalStorageを使いたいと思う。私はjQueryのための同様のプラグインを見て、それに感銘を受けませんでした。 – sadtaco

1

私は私自身の問題

var localStorageSpecCompliant = true; 
var specCompliantTestVal = new Date().getTime(); 
function onStorage(ev) { 
    if(ev.key == "specCompliantTest"+specCompliantTestVal){ 
     localStorageSpecCompliant = false; 
    } 
    localStorage.removeItem("specCompliantTest"+specCompliantTestVal); 
}; 
if(window.addEventListener){ 
    window.addEventListener("storage", onStorage, false); 
} else { window.attachEvent("onstorage", onStorage); } 

localStorage["specCompliantTest"+specCompliantTestVal] = "This tests if the browsers localStorage storage event is spec compliant or ont."; 

localStorage_setItem = function(key, value){ 
    localStorage[key] = value; 
    if(localStorageSpecCompliant){ 
     var dirtyFakeEvent = {"key":key, "newValue":value}; 
     onStorage(dirtyFakeEvent); 
    } 
} 

しかし、いつも同じことが、はるかにはるかに良いだろうイベントの仕事を作るパッチのいくつかの並べ替えを解決するものいくつか。この方法は理想的ではありません。私は本当の「ストレージ」イベントを偽造する方法を見つけ出すことができなかったので、関数を直接呼び出しました。

コンプライアンスを単に修正するフレームワークはすばらしいでしょう。 IE7に存在しないlocalStorageに問題はありません。しかし、あるブラウザや別のブラウザでは、仕様とはまったく異なる機能が問題になります。

関連する問題