Не удалось запустить событие 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);