2016-01-19 37 views
6

Wyświetlam powiadomienia dla użytkowników za pomocą wtyczki pnotify. Jednak chcę usunąć powiadomienie na wszystkich kartach, jeśli użytkownik zamknie powiadomienie na karcie 1, klikając ikonę X.Słuchaj tylko zdarzenia localStorage.removeItem()

Używam do tego localstorage, za każdym razem, gdy nowe powiadomienie jest pokazywane użytkownikowi, zostaje ono dodane do localStorage. Gdy użytkownik naciśnie ikonę X, wykonuję localStorage.removeItem(key). Jak mogę odsłuchać to wydarzenie, aby zamknąć powiadomienie na wszystkich kartach?

Mój słuchacz znajduje się poniżej:

$(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(); 
    } 
}); 

zauważyłem, że newValue zamienia się zerową, jeżeli zostało ono usunięte, teoretycznie byłoby to działa (jeszcze nie testowane), ale jest to wiarygodne pod względem będzie zawsze return null, jeśli removeItem został wywołany na tym elemencie? Co się stanie, jeśli wartość pozycji zmieni się na null, następnie wywoła to zdarzenie, ponieważ wartość zmieniła się w prawo?

+0

if (e.originalEvent.newValue == null) powinny być if (! E.originalEvent.newValue) – ymz

+1

@ymz nie ma potrzeby, aby obsłużyć 'undefined' tutaj, spec mówi, że' null' jest zwracana gdy klucz nie jest obecny. – Stijn

Odpowiedz

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

To wygląda na to, czego potrzebuję. Domyślam się, że localStorage nie ma tego wbudowanego i pozwala nam rozszerzyć go przez przesłonięcie funkcji removeItem. Nie wiedziałem, że to możliwe. Dzięki, spróbuję. – GGio

3

Magazyn lokalny przechowuje wszystko jako ciąg.

localStorage.setItem("foo", null); 

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

I rzeczywiście, newValue jest null gdy zostanie usunięty. MDN: StorageEvent mówi:

Nowa wartość klucza. Numer newValue jest null, gdy zmiana została wywołana przez metodę przechowywania clear() lub została usunięta z magazynu. Tylko czytać.

Dlatego można bezpiecznie sprawdzić pod kątem null za pomocą === null.

+0

Dziękuję. Więc czy mój test powinien zostać zmieniony na '===' null zamiast '==' null? Ponieważ wartość ciągu może mieć wartość "null". – GGio

+0

@GGio Właśnie dodałem, że do odpowiedzi. Powinieneś użyć '=== null'. – Stijn