2010-09-26 9 views
6

Napotkałem następujący problem w Safari 5.0 (nie we wszystkich przeglądarkach opartych na silniku WebKit), ten kod:Pozornie sprzeczne onstorage wyzwalanie w 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>                        

wyzwoli w pogotowiu, w przypadku klikamy przycisk. Chociaż ten kod -

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

wyzwala kilka powiadomień, a nie oczekiwać. Myślę, że to błąd, ale czy ktoś nie może mi wyjaśnić - dlaczego zamiana dwóch linii kodu powoduje tak dziwne zachowanie?

+3

Dunno, 'onstorage' nie działa dla mnie. Ale generalnie powinieneś unikać wywoływania globalnych zmiennych/funkcji 'onstorage' lub' onclick'. Ponieważ 'onclick' jest dostępny jako' window.onclick', będzie odbierać zdarzenia kliknięcia dla 'okna' nawet bez' addEventHandler'! – bobince

+0

Bobrowo, głupku))) masz całkowitą rację - są pewne problemy ze zmienną onclick w zasięgu globalnym. Niemniej jest to błąd, ale mniej enigmatyczny). – shabunc

+0

Jak to jest błąd, gdy próbujesz użyć nazw zastrzeżonych globalnych metod? – rxgx

Odpowiedz

1

Nie ma błędu (chociaż tak jak inni komentowali, nie nazwałbym programów obsługi zdarzeń jako funkcje globalne o nazwach, które mogą wprowadzać w błąd).

Problem polega na tym, jak działają powiadomienia dla localStorage. Zasadniczo zdarzenia są uruchamiane tylko dla okien (lub kart) innych, które używają tego samego obiektu localStorage.

Oto a similar question and answer tutaj na StackOverflow.

W twoim przykładzie zdarzenie o zmienionej pamięci nie zostanie uruchomione: przewodnik znajduje się na tej samej stronie.

Powiązane problemy