2010-09-26 9 views
6

que he encontrado el problema siguiente en el Safari 5.0 (no en todos los navegadores basados ​​en WebKit), este código:onstorage aparentemente incompatibles desencadenar en Safari

<html>                         
<script>                        
    var onstorage = function(evt) {                 
      alert([evt.key, evt.oldValue, evt.newValue].join('\n'));         
    }                         

    var onclick = function(evt) {                  
     localStorage.setItem('test', Math.random());             
    }                         

    var oninit = function() {                   
     //actually, it works the same way with old "plain event" onclick        
     document.querySelector('#test').addEventListener('click', onclick, false);      
     window.addEventListener('storage', onstorage, false);           
    }                         

</script>                        

<body onload="oninit()">                    
    <input id="test" type="button" value="setting a random value"/>         
</body>                        

activará en estado de alerta, en caso de que haga clic en el botón. Si bien este código -

<html>                         
<script>                        
    var onstorage = function(evt) {                 
      alert([evt.key, evt.oldValue, evt.newValue].join('\n'));         
    }                         

    var onclick = function(evt) {                  
     localStorage.setItem('test', Math.random());             
    }                         

    var oninit = function() {                       
     window.addEventListener('storage', onstorage, false); 
     //actually, it works the same way with old "plain event" onclick        
     document.querySelector('#test').addEventListener('click', onclick, false);          
    }                         

</script>                        

<body onload="oninit()">                    
    <input id="test" type="button" value="setting a random value"/>         
</body>                        

desencadena unos alerta, ya que no se esperaba. Creo que esto es un error, pero ¿alguien puede explicarme por qué cambiar dos líneas de códigos resulta en un comportamiento tan extraño?

+3

Dunno, 'onstorage' no funciona para mí. Pero, en general, debe evitar llamar variables globales/funciones 'onstorage' o' onclick'. Debido a que 'onclick' es accesible como' window.onclick', ¡recibirá los eventos click para 'window' incluso sin' addEventHandler'! – bobince

+0

bobince, tonto yo))) tienes toda la razón: hay algunos problemas con la variable onclick en el alcance global. No obstante, es un error, pero menos enigmático) – shabunc

+0

¿Cómo es un error cuando intentas usar nombres de métodos globales reservados? – rxgx

Respuesta

1

No hay ningún error (aunque como otros han comentado, no nombraría a los controladores de eventos como funciones globales con nombres que podrían confundir).

El problema es cómo funcionan las notificaciones de localStorage. En esencia, los eventos solo se activan para otras ventanas (o pestañas) que usan el mismo localStorage.

Aquí está a similar question and answer aquí en StackOverflow.

Por lo tanto, en su ejemplo, el evento de almacenamiento modificado no se activará: el controlador está en la misma página.

Cuestiones relacionadas