2010-09-26 8 views
6

Je l'ai rencontré la question suivante dans le Safari 5.0 (pas dans tous les navigateurs basés sur WebKit), ce code:onstorage apparemment incompatibles déclenchement dans 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>                        

déclenchera en état d'alerte, en cas, nous cliquons sur le bouton. Bien que ce code -

<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>                        

déclenche quelques alertes, ne pas prévu. Je pense que c'est un bug, mais quelqu'un ne peut-il pas m'expliquer - pourquoi échanger seulement deux lignes de codes aboutit à un comportement si bizarre?

+3

Dunno, 'onstorage' ne fonctionne pas pour moi. Mais en général, évitez d'appeler des variables/fonctions globales 'onstorage' ou' onclick'. Parce que 'onclick' est accessible en tant que' window.onclick', il recevra les événements click pour 'window' même sans' addEventHandler'! – bobince

+0

bobince, idiot moi))) vous avez totalement raison - il y a quelques problèmes avec la variable onclick dans la portée globale. Néanmoins, c'est un bug, mais moins énigmatique) – shabunc

+0

En quoi est-ce un bug lorsque vous essayez d'utiliser des noms de méthodes globaux réservés? – rxgx

Répondre

1

Il n'y a pas de bogue (bien que d'autres aient commenté que je ne nommerais pas les gestionnaires d'événements comme des fonctions globales avec des noms qui pourraient être confus).

Le problème est de savoir comment fonctionnent les notifications pour localStorage. En substance, les événements sont uniquement déclenchés pour autres fenêtres (ou onglets) qui utilisent le même localStorage.

Voici a similar question and answer ici sur StackOverflow. Ainsi, dans votre exemple, l'événement de stockage modifié ne se déclenchera pas: le gestionnaire se trouve sur la même page.