2010-09-26 7 views
6

mir das folgende Problem in der Safari 5.0 (nicht in allen WebKit-basierten Browsern) begegnet ist, dieser Code:Scheinbar im Widerspruch onstorage in Safari auslösenden

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

auf Alarm auslösen, in Fall klicken wir auf den Knopf. Während dieser 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>                        

löst einige Warnungen, da nicht zu erwarten. Ich denke, das ist ein Fehler, aber kann mir nicht jemand erklären - warum nur zwei Zeilen Code zu einem so seltsamen Verhalten führt?

+3

Dunno, 'onstorage' funktioniert nicht für mich. Im Allgemeinen sollten Sie jedoch vermeiden, die globalen Variablen/Funktionen 'onstorage' oder' onclick' zu nennen. Da 'onclick' als' window.onclick' zugänglich ist, wird es Click Events für 'window' auch ohne' addEventHandler' erhalten! – bobince

+0

bobince, dumme mich))) Sie haben völlig Recht - es gibt einige Probleme mit onclick Variable im globalen Umfang. Dennoch ist es ein Fehler, aber weniger rätselhaft) – shabunc

+0

Wie ist es ein Fehler, wenn Sie versuchen, reservierte globale Methodennamen zu verwenden? – rxgx

Antwort

1

Es gibt keinen Fehler (obwohl wie andere kommentiert haben, würde ich die Ereignishandler nicht als globale Funktionen mit Namen bezeichnen, die verwirren könnten).

Das Problem ist, wie die Benachrichtigungen für localStorage arbeiten. Im Wesentlichen werden Ereignisse nur für andere Fenster (oder Registerkarten) ausgelöst, die das gleiche localStorage verwenden.

Hier ist a similar question and answer hier auf StackOverflow.

In diesem Beispiel wird das Ereignis Speicheränderung nicht ausgelöst: Der Handler befindet sich auf derselben Seite.

Verwandte Themen