2012-04-21 16 views
11

puedo unir con éxito un evento de un cambio a localStorage (usando jQuery):¿Cómo puedo vincular el evento a sessionStorage?

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

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

Si uso sessionStorage, el evento se dispara:

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

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

¿Por qué es esto?

+0

¿Qué navegador (s)? –

+0

Estoy probando esto en Chrome. Debe funcionar en Chrome, FF e IE9 +. También debería mencionar que necesito el evento para disparar en otra pestaña/ventana (del mismo navegador). – Tesco

+1

No veo que este evento se active en Chrome, usando 'localStorage'. –

Respuesta

10

Así es como debe ser, creo. Desde el spec (énfasis añadido):

Cuando los setItem(), removeItem() y clear() métodos se llaman en un Storage objeto x que está asociada con un área de almacenamiento de sesión, si los métodos hicieron algo, entonces en cada objeto de documento cuya ventana objeto almacenamiento de del objeto sessionStorage atributo se asocia con la misma área de almacenamiento, distinta de x, un evento de almacenamiento debe ser despedido

I think lo que eso significa es que el evento se disparará en cualquier otro documento que comparta el objeto de almacenamiento de la sesión, pero no el documento que provocó el desencadenamiento del evento.

actualización

Aquí hay otro very similar question que parece estar de acuerdo con lo que he mencionado anteriormente (la respuesta cita el mismo párrafo de la especificación).

+0

Quiero que el evento se active en otra pestaña/ventana ("distinta de x"). ¿sessionStorage solo se aplica a la ventana/pestaña actual? – Tesco

+0

No, se aplica a la sesión. El evento * debe * dispararse en otras pestañas/ventanas, pero no debe * dispararse en el mismo documento. –

+0

¿es posible forzar el evento para disparar en la misma ventana? – user3281466

12

El sessionStorage está aislado para cada pestaña, por lo que no pueden comunicarse. Los eventos para sessionStorage se activan solo entre fotogramas en la misma pestaña.

EDIT:

He hecho el siguiente ejemplo:

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

La página de ejemplo tiene dos botones que desencadenan un cambio de almacenamiento de sesión local y.

También incrusta un iframe a otro codepen que escucha los eventos de almacenamiento de cambios: (. Debe mantener esta abierto en una pestaña diferente)

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

Usted se dará cuenta de que cuando se pulsa el El botón "Escribir local", tanto en el iframe como en la pestaña abierta, se captura el evento, pero cuando presiona "Escribir sesión" solo el iframe incrustado captura el evento.

+2

esto está mal. –

+0

@TraianTatic He actualizado la respuesta con un ejemplo. ¿Puedes ayudarnos a entender por qué la respuesta es incorrecta? ¡Gracias! –

+0

Estoy de acuerdo con @NicolaeSurdu. Necesitaba rastrear las actualizaciones de propiedades a través de StorageEvent en varias pestañas y sessionStorage no funcionó. Cuando cambié a usar una instancia localStorage, el StorageEvent se activó como se esperaba. Las propiedades almacenadas a través de localStorage son persistentes, por lo que debe eliminarlas manualmente del almacenamiento cuando haya terminado de usarlas. –

2

Esta pregunta parece estar obteniendo algunas vistas, así que solo publicaré esto como información adicional.

En caso de que deseen responder exclusivamente a cambios en el objeto sessionStorage, puede simplemente ignorar los eventos causados ​​por localStorage:

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

odio jQuery, por lo que va a publicar un la versión nativa así:

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