2017-09-25 43 views
1

我有一個問題:如何運作visibilitychange?

window.addEventListener("visibilitychange", function(e) { 
 
    console.log(window.uidd) 
 
    window.uidd = window.uidd || (new Date).getTime() + Math.random() 
 
    console.log(window.uidd) 
 
})

但是,如果你打開控制檯,並第一次你會得到:

undefined 
124124214124124.124 

window.uidd // undefined 

爲什麼會這樣最後一個字符串爲undefined

+0

因爲你第一次使用console.log,它是未定義的......如果你的事件監聽器只在第二行給它賦值。你爲什麼期望它不是'undefined'? – msanford

+0

@msanford它不是我的問題 –

+0

當我測試你的代碼示例時,最後一個字符串不是'undefined'。是否有代碼缺失? – msanford

回答

1

因爲我不能將屏幕截圖添加到評論中,所以我只能將其作爲答案,但我沒有看到這種行爲。

  1. 我確認在window上不存在window.uuid變量。
  2. 我添加事件監聽器,並獲得預期的第一個undefined註冊它。
  3. 然後我點擊出標籤(第一visibilitychange事件)的,並獲得第二undefinedwindow.uuid設置的值,無論是從監聽記錄。
  4. 我重新點擊標籤,發射第二個visibilitychange事件,並獲取uuid記錄兩次。
  5. 鍵入window.uuid進入控制檯返回全局uuid值。

enter image description here

我懷疑的混亂可能會在你安裝事件偵聽器的方式鋪設。

編輯:

具有以下測試頁:

<html> 
<head> 
    <script> 
     window.addEventListener("visibilitychange", function(e) { 
      console.dir(window); 
      console.log(window.uidd) 
      window.uidd = window.uidd || (new Date).getTime() + Math.random() 
      console.log(window.uidd) 
     }) 
    </script> 
</head> 
<body></body> 
</html> 

我確實看到了這種行爲。您需要使用this.uuid而不是window.uuid訪問該房產,即使簡單地輸入window也會顯示.uuid屬性。

奇怪的是,當我用這個靜態分配更換您的測試:

window.addEventListener("visibilitychange", function(e) { 
    window.foo = window.foo || "bar"; 
}) 

確實工作,我可以直接在控制檯中看到的window.foo預期值。我也很好奇,asked the Chrome team。如果有人不直接回答,我會更新此答案。

+0

如果您在控制檯中添加了監聽器,那是行得通的。嘗試在腳本塊中添加偵聽器。之後,當聽衆已經初始化window.uidd必須有價值,但你可以檢查它不是真相 –

+0

@ЮраПанарин更新。 – msanford

+1

它是如此奇怪的行爲 –