2013-06-15 10 views
10

Załóżmy, że chcę wykryć obsługę powiadomień (http://notifications.spec.whatwg.org/) w bibliotece JavaScript.Jakie jest najbardziej niezawodne podejście do wykrywania obsługi funkcji przeglądarki?

Mogę użyć window.Notification !== undefined. Ale co, jeśli użytkownicy biblioteki (lub innej biblioteki) również mają jakiś globalny obiekt zdefiniowany dla zupełnie innego celu?

Z drugiej strony, a jeśli druga biblioteka jest polyfill? Wtedy ich obiekt Notification jest akceptowalny. Czy powinienem przetestować wszystkie metody oprócz testowania obiektu globalnego?

Aktualizacja:
Zauważyłem ciekawą rzecz w jednym notifications polyfill:

ret[toString] = function() { 
    return 'function Notification() { [native code] }'; 
}; 

Jak niezawodny powołuje się na coś takiego, aby wykryć, czy jest to rodzimy/przedmiot polyfill?

+5

Należy jasno określić wymagania środowiskowe dla swojej biblioteki. Więc nie musisz się tym martwić. Pozwól użytkownikowi upewnić się, że inne biblioteki będą współpracować. –

+1

Zgadzam się. Jeśli użytkownik jest na tyle szalony, aby korzystać z bibliotek zanieczyszczających globalną przestrzeń nazw, niewiele można zrobić, prawda? –

+0

To dobra odpowiedź, ale tylko wtedy, gdy nie ma innych opcji. Lubię, gdy tylko mogę, ratować ludzi przed potencjalnymi błędami. –

Odpowiedz

1

Tak więc zasadniczo istnieją dwie możliwości.

Najpierw należy polegać na wartości 'function Notification() { [native code] }'toString, ponieważ jest ona ustawiana przynajmniej przez niektóre wielokąty. Niestety, nie jest to wiarygodne, ponieważ nie znalazłem żadnych informacji na temat tego, czy jest to wspólne podejście wśród autorów polyfill i czy jest ono niezawodną wartością zwracaną w przeglądarkach.

Inną opcją, jak sugeruje się w komentarzach, jest ignorowanie potencjalnych konfliktów i po prostu kontynuowanie testów na istnienie. Po to właśnie poszedłem.

0

zawsze można wziąć podejścia jQuery i przedefiniować niczego, co jest odwołanie do wcześniej istniejących window.Notifications z czymś takim:

window._Notification = window.Notification; 

Paul irlandzki ma trochę w this video który robi bardzo dobrą robotę wyjaśniania jak to działa.

W ten sposób możesz kontynuować wdrażanie dowolnej innej funkcji, z której korzystają, a jednocześnie nadal korzystać z Twojej.

Nadzieję, że pomaga. :)

+0

Myślę, że źle zrozumiałeś pytanie. Chce wiedzieć, czy może używać "Powiadomienia", a nie jak go zastąpić bez niszczenia czegokolwiek. –

Powiązane problemy