Javascript localStorage.getItem返回IE 9中的旧数据
以下示例需要在IE 9中运行,并且至少在两个不同的选项卡中运行Javascript localStorage.getItem返回IE 9中的旧数据,javascript,html,internet-explorer-9,local-storage,Javascript,Html,Internet Explorer 9,Local Storage,以下示例需要在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"&g
<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')获取数据代码>并在选项卡1中输入测试
,然后它在我的
中正确显示测试
,但在我的选项卡2中
它只写tes
现在,如果我将代码更改为使用var newValue=e.newValue代码>选项卡1和选项卡2都在
有人能给我解释一下,为什么他们会返回不同的结果吗?
我也在Google Chrome和Firefox中测试了这段代码,他们没有这个问题
为了记录在案,这是在Win7 Ultimate 64 SP1上运行的,带有IIS Express,并使用jquery-1.5.1。该漏洞存在于32位和64位版本的IE9中
编辑
使用标准IIS 7.5测试,结果相同
编辑2
如果有人能证实这一情况发生在他们身上,那就太好了。至于他们为什么返回不同的结果,答案很明显。IE上的storage
事件在值更改之前触发,在其他浏览器上则在更改之后触发。您可以通过以下代码确认:
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
}
虽然我不知道为什么它会以这种方式实现,但我猜太模糊了,没有说明事件应该在什么时候触发
存储区域发生更改时触发存储事件,如前两节所述(对于会话存储,对于本地存储)
发生这种情况时,用户代理必须将任务排队,以便在其文档对象具有受影响的存储对象的每个窗口对象处触发名为storage的事件,该事件不冒泡且不可取消,并且使用StorageEvent接口
IE中有onstoragecommit
事件。可以使用document.onstoragecommit!==未定义功能检测和订阅该事件的
。@kirilloid虽然值更改后会引发onstoragecommit,但它只会在实际更改存储的一个浏览器选项卡上引发,而不会在其他选项卡上引发。@AndyGeek重点是检查此事件(处理程序)是否存在,不订阅。这仍然是Internet Explorer 11中的一个问题。