2012-02-15 33 views
6

Ví dụ sau cần chạy trong IE 9 và trong ít nhất hai tab khác nhau.localStorage.getItem trả về dữ liệu cũ trong 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> 

Nếu nó cố gắng để có được những dữ liệu với var newValue = localstorage.getItem('storage-event-test'); và trong Tab 1 vào test sau đó nó cho thấy một cách chính xác test trong <p id="fromEvent"> của tôi, nhưng trong Tab của tôi 2 nó chỉ viết tes

Bây giờ nếu Tôi thay đổi mã để sử dụng var newValue = e.newValue; cả hai Tab 1 & Tab 2 viết test trong <p id="fromEvent">

Ai đó có thể giải thích cho tôi, tại sao họ trả lại các kết quả khác nhau? Tôi cũng đã thử nghiệm mã này trong Google Chrome và Firefox và họ không gặp sự cố này.

Chỉ để ghi lại, điều này đã chạy trên chiến thắng 7 Ultimate 64 SP1 với IIS Express và sử dụng jquery-1.5.1. và lỗi này là trong cả hai phiên bản 32 và 64 bit của IE9

Sửa Thử nghiệm với kết quả tương tự bình thường IIS 7,5

Chỉnh sửa 2 Sẽ được tốt đẹp nếu ai đó có thể khẳng định rằng điều này xảy ra họ đến?

+2

Đây vẫn là sự cố trong Internet Explorer 11. – Sonny

Trả lời

5

Vì sao họ trả về các kết quả khác nhau nên câu trả lời là khá rõ ràng. Sự kiện storage trên IE được kích hoạt trước thay đổi giá trị và sau trên các trình duyệt khác. Bạn có thể xác nhận điều này bởi adding a slight delay mã của bạn:

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 
} 

Tôi không biết lý do tại sao nó được thực hiện theo cách này mặc dù, nhưng tôi đoán specification là quá mơ hồ và không nói khi sự kiện nên được kích hoạt.

Các lưu trữ Sự kiện này được kích hoạt khi một thay đổi khu vực lưu trữ, như mô tả trong hai phần trước (đối với lưu trữ phiên, để lưu trữ địa phương).

Khi điều này xảy ra, tác nhân người dùng phải xếp hàng một nhiệm vụ để bắn một sự kiện với việc lưu trữ tên, mà không làm bong bóng và không hủy ngang, và trong đó sử dụng giao diện StorageEvent, tại mỗi Window đối tượng có Đối tượng tài liệu có một đối tượng Bộ nhớ bị ảnh hưởng.

+3

Có sự kiện 'onstoragecommit' trong IE. Người ta có thể sử dụng 'document.onstoragecommit! == undefined' để phát hiện tính năng và đăng ký cho sự kiện đó. – kirilloid

+0

@kirilloid Mặc dù onstoragecommit sẽ được nâng lên khi giá trị đã thay đổi, nó sẽ chỉ được nâng lên trên một tab trình duyệt thực sự đã thay đổi bộ nhớ và không thay đổi trên các tab khác. – AndyGeek

+0

@AndyGeek Vấn đề là kiểm tra * sự tồn tại * của sự kiện này (xử lý), không đăng ký với nó. – kirilloid

Các vấn đề liên quan