2012-04-21 33 views
11

tôi thành công có thể ràng buộc một sự kiện cho một sự thay đổi để localStorage (sử dụng jquery):Làm cách nào để liên kết sự kiện với sessionStorage?

$(window).bind('storage', function(e) 
{ 
    alert('change'); 
}); 

localStorage.setItem('someItem', 'someValue'); 

Nếu tôi sử dụng sessionStorage, sự kiện này sẽ KHÔNG lửa:

$(window).bind('storage', function(e) 
{ 
    alert('change'); 
}); 

sessionStorage.setItem('someItem', 'someValue'); 

Tại sao điều này?

+0

Trình duyệt nào? –

+0

Tôi đang thử nghiệm điều này trong Chrome. Nó phải hoạt động trong Chrome, FF và IE9 +. Tôi cũng nên đề cập rằng tôi cần sự kiện để kích hoạt trong một Tab/cửa sổ khác (của cùng một trình duyệt). – Tesco

+1

Tôi không thấy sự kiện này được kích hoạt trong Chrome, sử dụng 'localStorage'. –

Trả lời

10

Đó là cách tôi nghĩ. Từ spec (nhấn mạnh thêm):

Khi setItem(), removeItem(), và clear() phương pháp này được gọi là trên Storage đối tượng x được liên kết với một khu vực lưu trữ session, nếu các phương pháp đã làm một cái gì đó, sau đó trong mỗi đối tượng tài liệu mà Window đối tượng lưu trữ đối tượng của sessionStorage thuộc tính được gắn liền với khu vực lưu trữ cùng, khác hơn x, một sự kiện lưu trữ phải được bắn

I nghĩ rằng điều đó có nghĩa là sự kiện sẽ được kích hoạt trong bất kỳ tài liệu nào khác chia sẻ đối tượng lưu trữ phiên, nhưng không phải tài liệu đã gây ra sự kiện kích hoạt.

Cập nhật

Đây là một very similar question mà dường như đồng ý với những gì tôi đã đề cập ở trên (câu trả lời trích đoạn tương tự từ spec).

+0

Tôi muốn sự kiện kích hoạt trong tab/cửa sổ khác ("ngoài x"). SessionStorage chỉ áp dụng cho cửa sổ/tab hiện tại? – Tesco

+0

Không, nó áp dụng cho phiên. Sự kiện * sẽ * kích hoạt trong các tab/cửa sổ khác, nhưng không nên * kích hoạt trong cùng một tài liệu. –

+0

có thể buộc sự kiện xảy ra trong cùng một cửa sổ không? – user3281466

12

sessionStorage bị cô lập cho mỗi tab, vì vậy chúng không thể liên lạc được. Sự kiện cho sessionStorage chỉ được kích hoạt ở giữa các khung trên cùng một tab.

EDIT:

tôi đã thực hiện các ví dụ sau:

http://codepen.io/surdu/pen/QGZGLO?editors=1010

Các trang ví dụ có hai nút kích hoạt một địa phương và một sự thay đổi lưu trữ phiên.

Nó cũng đồng thời nhúng iframe để khác codepen mà nghe cho các sự kiện lưu trữ thay đổi: (. Bạn nên giữ này mở trong một tab khác)

http://codepen.io/surdu/pen/GNYNrW?editors=1010

Bạn sẽ nhận thấy rằng khi bạn nhấn Nút "Viết cục bộ", trong cả khung nội tuyến lẫn tab đã mở, sự kiện được chụp, nhưng khi bạn nhấn "Ghi phiên", chỉ iframe được nhúng mới nắm bắt được sự kiện.

+2

điều này là sai .. –

+0

@TraianTatic Tôi đã cập nhật câu trả lời với một ví dụ. Bạn có thể vui lòng giúp chúng tôi hiểu tại sao câu trả lời là sai? Cảm ơn! –

+0

Tôi đồng ý với @NicolaeSurdu. Tôi cần theo dõi các cập nhật đặc tính thông qua một StorageEvent trên nhiều tab và sessionStorage không hoạt động. Khi tôi chuyển sang sử dụng một cá thể localStorage, StorageEvent được kích hoạt như mong đợi. Các thuộc tính được lưu trữ thông qua localStorage liên tục nên bạn cần phải xóa chúng khỏi lưu trữ theo cách thủ công khi bạn sử dụng xong chúng. –

2

Câu hỏi này dường như đang nhận được một vài lượt xem, vì vậy tôi sẽ chỉ đăng thông tin này dưới dạng thông tin bổ sung.

Trong trường hợp bạn muốn trả lời riêng cho các cập nhật về các đối tượng sessionStorage, bạn chỉ có thể bỏ qua các sự kiện do localStorage:

$(window).on('storage',function(e){ 
    if(e.originalEvent.storageArea===sessionStorage){ 
    alert('change'); 
    } 
    // else, event is caused by an update to localStorage, ignore it 
}); 

Tôi ghét jQuery, như vậy sẽ gửi một phiên bản bản địa cũng như:

window.addEventListener('storage',function(e){ 
    if(e.storageArea===sessionStorage){ 
    alert('change'); 
    } 
    // else, event is caused by an update to localStorage, ignore it 
}); 
Các vấn đề liên quan