2011-03-20 25 views
9

Agregué un eventListener a la ventana DOM-Object y quiero hacer un seguimiento de los cambios realizados a localStorage.localStorage eventListener no se llama

<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script> 

    <script language="JavaScript"><!-- 
     window.addEventListener('storage', storageEventHandler, false); 
     function storageEventHandler(evt){ 
      console.log("oldValue: " + evt.oldValue); 
      console.log("storage event called key: " + evt.key); 
      console.log("newValue: " + evt.newValue); 

     } 
     $(document).ready(function(event) { 
      $('#link1').click(function(event){ 
       event.preventDefault(); 
       localStorage.setItem('page', 2000); 
       console.log(localStorage.getItem('page')); 
      }); 
      $('#link2').click(function(event){ 
       event.preventDefault(); 
       localStorage.setItem('page', 998); 
       console.log(localStorage.getItem('page')); 

      }); 

     }); 
    </script> 
</head> 
</html> 

De alguna manera el storageEventHandler nunca es llamado a pesar de que se cambia el valor localStorage cuando hago clic Link1 Link2 o. Cualquier ayuda es muy apreciada.

+2

si el evento 'storage' se activa o no, depende del navegador. – jAndy

+1

Eso es correcto, ver p. http://code.google.com/p/chromium/issues/detail?id=48159. – pimvdb

Respuesta

18

Algunos navegadores no admiten el evento de almacenamiento, y la mayoría de los navegadores que sí lo admiten solo lo llaman cuando el almacenamiento se cambia por una ventana diferente. Por lo tanto, abra su página en dos ventanas. Haga clic en los enlaces en una ventana y probablemente verá el evento en la otra.

Se supone que su página ya conocerá todas las interacciones con localStorage en su propia ventana y solo necesita notificación cuando una ventana diferente cambie las cosas. Esto, por supuesto, es una suposición tonta. Pero, localStorage es algo nuevo. Con suerte, eventualmente lo resolverán todo.

+6

desafortunadamente, el tiempo antes mencionado "eventualmente" no ha llegado aún :( –

+0

Lamentablemente, eso es cierto. Espero hacer tiempo para volver a visitar esto eventualmente. Tengo algunas ideas para hackear algunas de estas cosas. Simplemente no lo hago. Ahora tengo mucho tiempo para tales experimentos. –

+1

http://html5demos.com/storage-events – vsync

8

El controlador de eventos storage solo afectará a otras ventanas. Cada vez que algo cambia en una ventana dentro de localStorage, todas las demás ventanas reciben una notificación al respecto y, si es necesario realizar alguna acción, se puede lograr mediante una función de controlador que escuche el evento storage.

Para la misma ventana tiene que llamar manualmente a la función storageEventHandler después de llamar al localStorage.setItem() para lograr el mismo comportamiento en la misma ventana.

+0

Esa es la respuesta. Gracias. – user2422869