2012-02-15 2 views
6

Следующий пример должен быть запущен в IE 9 и по меньшей мере в двух разных вкладках.localStorage.getItem возвращает старые данные в IE 9

<input type="text" name="data" value="" placeholder="change me" id="data" /> 
<p id="fromEvent">Waiting for data via <code>storage</code> event...</p> 

<script type="text/javascript"> 
window.addEventListener("storage", function (e) { 
    if (e.key == 'storage-event-test') { 
     var newValue = localStorage.getItem('storage-event-test'); // returns old value 
    // var newValue = e.newValue; // returns new value 
     $('#fromEvent').html(newValue); 
    } 
    }, false); 

    $('#data').live('keyup', function() { 
    var changedValue = this.value; 
     $('#fromEvent').html(changedValue); 
     localStorage.setItem('storage-event-test', changedValue); 
    }); 
</script> 

Если попытаться получить данные с var newValue = localstorage.getItem('storage-event-test'); и в Tab 1 входит test то правильно test показывает в моем <p id="fromEvent"> но в моем Tab 2 он пишет только tes

Теперь, если Я изменяю код для использования var newValue = e.newValue; обе Tab 1 & Tab 2 пишет test в <p id="fromEvent">

Может кто-нибудь объяснить мне, почему они возвращают разные результаты? Я также проверил этот код в Google Chrome и Firefox, и у них нет этой проблемы.

Просто для записи это было выполнено на выигрыше 7 Ultimate 64 SP1 с IIS Express и с использованием jquery-1.5.1. и ошибка в обоих 32 и 64 битной версии IE9

Edit Испытано с нормальным IIS 7.5 тот же результат

Edit 2 Было бы хорошо, если бы кто-то может подтвердить, что это происходит с их?

+2

Это все еще проблема в Internet Explorer 11. – Sonny

ответ

5

Что касается того, почему они возвращают разные результаты, ответ довольно очевиден. Событие storage на IE запущено до значение изменяется и после в других браузерах. Вы можете подтвердить это adding a slight delay к коду:

if (e.key == 'storage-event-test') { 
    // e.newValue -> new value 
    // localStorage.getItem('storage-event-test') -> old value in IE 
    setTimeout(function(){ 
     var newValue = localStorage.getItem('storage-event-test'); // new value 
     $('#fromEvent').html(newValue); 
    }, 1); // delay 
} 

Я не знаю, почему он реализован таким образом, хотя, но я предполагаю, что specification является слишком расплывчатым и не говорит, когда событие должно быть запущено.

хранение события вызывается, когда область хранения изменяется, как описано в двух предыдущих разделах (для хранения сеанса, для локального хранения).

Когда это происходит, агент пользователя должен очередь задания на запуск события с хранением имени, которое не делает пузырь и не отменяемые, и который использует интерфейс в StorageEvent, на каждом Window объекта, Документ Объект имеет Хранение Объект, на который влияет.

+3

В IE есть событие onstoragecommit. Для обнаружения функций и подписки на это событие можно использовать 'document.onstoragecommit! == undefined'. – kirilloid

+0

@kirilloid Хотя onstoragecommit будет поднят после изменения значения, он будет поднят только на одной вкладке браузера, которая фактически изменила хранилище, а не на других вкладках. – AndyGeek

+0

@ AndyGeek Дело в том, чтобы проверить * существование * этого события (обработчик), а не подписываться на него. – kirilloid

Смежные вопросы