2010-09-26 10 views
6

ho incontrato il seguente problema in Safari 5.0 (non in tutti i browser basati su WebKit), questo codice:onstorage Apparentemente incoerente innescando in 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>                        

attiveranno in allerta, in caso facciamo clic sul pulsante. Mentre questo codice -

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

innesca alcuni avvisi, in quanto non previsto. Penso che questo sia un bug, ma qualcuno non può spiegarmi: perché scambiare solo due righe di codice risulta in un comportamento così strano?

+3

Dunno, 'onstorage' non funziona per me. Ma in generale dovresti evitare di chiamare variabili globali/funzioni 'onstorage' o' onclick'. Poiché 'onclick' è accessibile come' window.onclick', riceverà gli eventi click per 'window' anche senza' addEventHandler'! – bobince

+0

bobince, stupido me))) hai perfettamente ragione - ci sono alcuni problemi con la variabile onclick nell'ambito globale. Tuttavia, si tratta di un bug, ma meno enigmatico) – shabunc

+0

Come si presenta un bug quando si tenta di utilizzare nomi di metodi globali riservati? – rxgx

risposta

1

Non c'è alcun errore (anche se come altri hanno commentato non nominerei i gestori di eventi come funzioni globali con nomi che potrebbero confondere).

Il problema è come funzionano le notifiche per localStorage. In sostanza, gli eventi vengono attivati ​​solo per altre finestre (o schede) che utilizzano lo stesso localStorage.

Ecco lo a similar question and answer qui su StackOverflow.

Quindi, nel tuo esempio, l'evento di archiviazione modificato non verrà attivato: il gestore si trova sulla stessa pagina.

Problemi correlati