2016-01-19 214 views
6

我正在使用pnotify插件向用戶顯示通知。但是,如果用戶通過單擊X圖標關閉1選項卡中的通知,我想要刪除所有選項卡上的通知。僅收聽localStorage.removeItem()事件

我爲此使用localstorage,每次向用戶顯示新通知時,都會將其添加到localStorage。當用戶按下X圖標時,我做了localStorage.removeItem(key)。如何收聽此活動以關閉所有標籤中的通知?

我的聽衆是下面:

$(window).bind('storage', function(e) { 
    // if it was removed 
    if (e.originalEvent.newValue == null) { 
     var notificationObject = e.originalEvent.oldValue; 

     // call remove function on pnotify object 
     notificationObject.remove(); 
    } 
}); 

我注意到,NEWVALUE變成零,如果它被刪除,理論上這會工作(還沒有測試過),但它是可靠的條款將它總是如果在該項目上調用removeItem,則返回null?如果項目值更改爲null,那麼它會觸發該事件,因爲值更改的權利?

+0

如果(e.originalEvent.newValue == NULL)應該是如果(!e.originalEvent.newValue) – ymz

+1

@ymz沒有必要處理'undefined'這裏,規範決定了'返回null'當鑰匙不存在時。 – Stijn

回答

2
$(window).on("itemRemoved", function(e, args) { 
    console.log(e, args); 
    if (!localStorage.getItem(args)) { 
    // do stuff 
    } 
}) 

fn = localStorage.removeItem; 
localStorage.removeItem = function() { 
    var args = arguments; 
    setTimeout(function() { 
    $(window).trigger("itemRemoved", [args[0]]) 
    }); 
return fn.call(localStorage, args[0]); 
} 
+0

這看起來像我所需要的。我想localStorage沒有內置這個,並允許我們通過重寫removeItem函數來擴展它。不知道這是可能的。謝謝,我會試試這個。 – GGio

3

本地存儲以字符串形式存儲所有內容。

localStorage.setItem("foo", null); 

// returns "null" 
localStorage.getItem("foo"); 

事實上,newValuenull當它刪除。 MDN: StorageEvent說:

該鍵的新值。 newValuenull當更改已被調用存儲clear()方法或key已從存儲中刪除。只讀。

因此,使用=== null檢查null是安全的。

+0

謝謝。那麼我的支票應該改爲'==='null而不是'=='null嗎?由於字符串值可能爲'null'。 – GGio

+0

@GGio我剛剛添加到答案。你應該使用'=== null''。 – Stijn