Не удалось запустить событие localStorage IE

В Internet Explorer 9 и 10 реализация localStorage неожиданно запускает события (большой поток здесь: Ошибка с реализацией локального хранилища Chrome?)

Кто-нибудь знает, как остановить событие storage от включения вкладок, инициировавших изменение в Internet Explorer?

Например, следующее сообщение не должно показывать предупреждение при нажатии кнопки добавления, но в IE:

скрипт: 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: На стороне примечания, я открыл ошибку с MS здесь. https://connect.microsoft.com/IE/feedback/details/798684/ie-localstorage-event-misfired

Может быть, он не закрывается.....

Ответ 1

Изменение вашего script на следующее предотвращает обработку любых событий хранения в сфокусированном окне.

Это не совсем то, что вы просили, так как я считаю, что для браузера потребуется заплата, но IE 9/10 соответствует спецификации, не оказывая негативного влияния на другие браузеры (кроме глобальных и слушателей).

<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>

См. эта скрипка для обновленного, соответствующего поведения.

Изменить: Следующее также работает и позволяет избежать прослушивания за счет проверки времени работы окна:

<script type="text/javascript" >

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

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

</script>

Ответ 2

Если вы ищете обходной путь, вы можете написать оболочку для localStorage с помощью семафора.

Попробуйте это (не проверено):

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);