2013-08-27 11 views
10

w programie Internet Explorer 9 & 10, realizacja localStorage pożary zdarzenia niespodziewanie (świetny wątek tutaj: Bug with Chrome's localStorage implementation?)IE localStorage wypalił

Czy ktoś wie, jak go zatrzymać zdarzenie storage od wypalania na kartach, które zainicjowała zmianę w internetowym eksploratorze?

Na przykład następujący nie powinien pokazać alert, gdy przycisk add kliknięciu, ale nie w IE:

skrzypce: http://jsfiddle.net/MKFLs/

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Chrome localStorage Test</title> 
    <script type="text/javascript" > 

     var handle_storage = function() { 
     alert('storage event'); 
     }; 

     window.addEventListener("storage", handle_storage, false); 

    </script> 
    </head> 
    <body> 
    <button id="add" onclick="localStorage.setItem('a','test')">Add</button> 
    <button id="clear" onclick="localStorage.clear()">Clear</button> 
    </body> 
</html> 

EDIT: Na marginesie, "Otworzyłem błąd z MS tutaj. https://connect.microsoft.com/IE/feedback/details/798684/ie-localstorage-event-misfired

Może to nie zostanie zamknięty .....

+0

@EricLaw dzięki za edycji :) – Jesse

Odpowiedz

11

Zmiana skryptu do następujących uniemożliwia obsługę wszelkich imprez magazynowych w aktywnym oknie.

Nie jest to dokładnie to, o co prosiłeś, ponieważ uważam, że wymagałoby to poprawki do przeglądarki, ale powoduje to, że IE 9/10 jest zgodny ze specyfikacją, nie mając przy tym negatywnych skutków dla innych przeglądarek (innych niż globalne). i słuchaczy).

<script type="text/javascript" > 
     var focused; 

     window.addEventListener('focus', function(){focused=1;}, false); 
     window.addEventListener('blur', function(){focused=0;}, false); 

     var handle_storage = function (e) { 
     if(!focused) 
      alert("Storage",focused); 
     }; 

     window.addEventListener("storage", handle_storage, false); 

</script> 

Zobacz zaktualizowane, zgodne zachowanie, patrz this fiddle.

Edit: Poniższe działa również i unika słuchaczy kosztem kontroli wykonawczego okiennej naciskiem:

<script type="text/javascript" > 

     var handle_storage = function (e) { 
     if(!document.hasFocus()) 
      alert("Storage"); 
     }; 

     window.addEventListener("storage", handle_storage, false); 

</script> 
+0

nie trzeba dodatkowej zmiennej: http://stackoverflow.com/a/8235434/255363 (testowałem - działa z IE9 +, gdzie pojawiły się zdarzenia pamięci masowej) – kirilloid

0

Jeśli szukasz obejście, można napisać otoki dla localStorage z semafora.

Spróbuj tego (nie testowane):

var BetterStorage = { 
    _semaphore: false, 
    setItem: function(key, item) { 
     var that = this; 
     this._semaphore = 1; // only this tab 
     localStorage.setItem(key, item); 
     this._semaphore = 0; 
     // or setTimeout(function(){that._semaphore = 0}, 10) 
     // based on event-fire time (immedietaly or after short delay?) 
     // not tested 
    }, 
    getItem: function() {/*code*/}, 
    createHandler: function(f) { 
     var that = this; 
     return function(e){ 
      if (that._semaphore) { // execution of event is blocked 
       return false; 
      } 
      else { 
       return f(e); 
      } 
     } 
    } 
} 


var handle_storage = BetterStorage.createHandler(function() { 
     alert('storage event'); 
}); 
window.addEventListener("storage", handle_storage, false); 
+1

To rozwiązanie nie działa - setItem kończy się i zwraca zanim zdarzenie zostanie uruchomione, więc semafor zostanie już wyczyszczony. –