Казалось бы, непоследовательный запуск хранилища в Safari - PullRequest
6 голосов
/ 27 сентября 2010

Я столкнулся со следующей проблемой в Safari 5.0 (не во всех браузерах на основе WebKit), этот код:

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

сработает при предупреждении, если мынажмите на кнопку.Хотя этот код -

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

вызывает несколько предупреждений, как и ожидалось.Я действительно считаю, что это ошибка, но никто не может объяснить мне - почему замена только двух строк кода приводит к такому странному поведению?

1 Ответ

1 голос
/ 09 июня 2011

Нет ошибки (хотя, как и другие, прокомментировал, я бы не назвал обработчики событий как глобальные функции с именами, которые могут привести к путанице).

Проблема в том, как работают уведомления для localStorage.По сути, события запускаются только для других окон (или вкладок), которые используют тот же localStorage.

Вот аналогичный вопрос и ответ здесь, в StackOverflow.

Итак, в вашем примере событие изменения хранилища не сработает: обработчик находится на той же странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...