2010-09-26 20 views
6
觸發

我遇到了以下問題的Safari瀏覽器5.0(不是在所有基於WebKit的瀏覽器),此代碼:看似不一致onstorage在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>                        

將觸發警戒,在我們點擊按鈕。儘管此代碼 -

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

幾個觸發警報,預計不會。 我確實認爲這是一個錯誤,但不能有人解釋我 - 爲什麼只交換兩行代碼會導致這種奇怪的行爲?

+3

鄧諾,'onstorage'不適合我。但總的來說,你應該避免調用全局變量/函數'onstorage'或'onclick'。因爲'onclick'可以作爲'window.onclick'訪問,所以即使沒有'addEventHandler',它也會接收'window'的點擊事件! – bobince 2010-09-27 00:12:38

+0

bobince,傻我)))你是完全正確的 - 全球範圍內的onclick變量存在一些問題。儘管如此,這是一個錯誤,但不那麼神祕) – shabunc 2010-09-27 07:01:14

+0

當您嘗試使用保留的全局方法名稱時,它如何成爲一個錯誤? – rxgx 2011-01-06 05:34:34

回答

1

沒有錯誤(儘管像其他人一樣評論說我不會將事件處理程序命名爲具有可能混淆名稱的全局函數)。

問題是如何通知localStorage的工作。從本質上講,只有使用相同localStorage的窗口(或選項卡)纔會觸發其他事件。

Here's a similar question and answer here on StackOverflow。

因此,在您的示例中,存儲更改事件不會觸發:處理程序位於同一頁面上。

相關問題