Aktywne Wpisy

masternodeBTC +284
Wskaż przedmiot, usługę lub czynność, która w ostatnim czasie poprawiła komfort, zdrowie, bezpieczeństwo lub prywatność w Twoim życiu.
Od 5 lat rozmawiamy na tagu #mirekmasterclass o wszelkich usprawnieniach życia. Polecasz rzeczy dzięki którym żyje Ci się lepiej, a w komentarzach nawiązujemy dyskusje, z których powstają kolejne pomysły. Każdy może polubić rozwiązania z których też korzysta, aby pomóc społeczności dokonać trafnych zakupów z polecenia. Tag obserwuje już ponad 7500 osób.
Zobacz najpopularniejszy wpis
Od 5 lat rozmawiamy na tagu #mirekmasterclass o wszelkich usprawnieniach życia. Polecasz rzeczy dzięki którym żyje Ci się lepiej, a w komentarzach nawiązujemy dyskusje, z których powstają kolejne pomysły. Każdy może polubić rozwiązania z których też korzysta, aby pomóc społeczności dokonać trafnych zakupów z polecenia. Tag obserwuje już ponad 7500 osób.
Zobacz najpopularniejszy wpis

henk +569
źródło: temp_file2707151242293985713
Pobierz




Witajcie, Mam pytanie. Otóż robię sobie dość krótką funkcję, która wykrywałaby wersję Firefoxa. Będzie to coś podobnego do hacków ze strony http://browserhacks.com/. Jako że planuję się nią z Wami w niedalekiej przyszłości podzielić, chciałbym wiedzieć co o tym myślicie - czy byłoby to przydatne czy też nie.
Dobrze wiemy, że powinno się używać feature detection, lecz nieraz zdarzyło się, że dany quirk występował tylko na jednej (ewentualnie kilku) wersjach poszczególnej przeglądarki. Ci, którzy nie korzystają (bo nie mogą lub nie chcą) z frameworków (mogą też właściwie przestać czytać ten wpis :P) wiedzą o co chodzi. Moja funkcja nie ma na celu wykrywania przeglądarki po UA. Na jakiej zasadzie będzie to działać? Coś a'la feature detection.
1. Na znanych bugach JS, które łatwo odtworzyć (nie potrzeba dużej ilości kodu).
2. Wykrywanie poszczególnych reguł CSS.
3. Obsługa atrybutu w elemenecie HTML.
4. Obsługa elementu HTML.
Dla każdej wersji znajduję coś z powyższych punktów (może będę łączył kilka na raz). W żadnym wypadku nie staram się wykrywać funkcji JS, bo niektórzy mogą używać polyfillów i wtedy wynik mógłby być niedokładny. Również omijam funkcje (zarówno JS i CSS), które można włączyć w about:config.
Przykłady:
35 String(Symbol("P0lip")) === "(\"Symbol(P0lip)\")" jest true, w niższej (34) wyrzuca TypeError.
var _1 = { 1 : 1, 1 : 1 } - taki obiekt (ze zduplikowanymi nazwami) w strict mode wyrzuca SyntaxError. Jest to jak najbardziej prawidłowe, jeśli brać pod uwagę dokumentację ECMAScript5. W ECMAScript6 wyrzucono to ograniczenie. Tak wykrywam FF 34, w którym jest to zmienione.
Na przykład FF 31 wykrywam poprzez zmienne CSS, które od tej wersji są definiowane z przedrostkiem "--".
26 poprzez obsługę -moz-text-decoration-line:blink
16 na przykład poprzez wykrycie elementu HTML Object.prototype.toString.call(document.createElement("meter")) === "[object HTMLMeterElement]";
Obecnie mam wszystkie wersje od 35 do 16. Jak dojdę do 2-3 to opublikuję Wam te wszystkie rzeczy, dzięki którym będziecie mogli wykryć poszczególną wersję FF. Niemniej nie zalecam ich używania. Używajcie jeśli naprawdę jest jakiś quirk, który będzie występował w danej wersji FF i nie będzie go łatwo ominąć feature detection czy innymi sposobami.
Co myślicie o tym? Byłoby to dla Was przydatne?
Ja do tego celu polecałbym to: https://github.com/WhichBrowser/WhichBrowser
W czym Twoje rozwiązanie będzie lepsze? :)
@P0lip: Zawsze możesz, z pewnym prawdopodobieństwem*, sprawdzić czy funkcja jest natywna.
* bo nie wszystkie przeglądarki implementują zachowanie o którym mówię, ale jeśli ograniczasz się tylko do FF to chyba powinno działać zawsze
@lucku: Najpiew sprawdza regexem wersję FF z UA. Potem bierze test do danej wersji i jeśli się zgadza to bierze test przeznaczony dla wyższej wersji, który musi zwrócić undefined lub false. Jeśli oba warunki są spełnione to wersja z UA będzie wersją, którą funkcja zwróci. Jeśli pierwszy lub drugi warunek nie jest spełniony (jeśli UA
function() { \n [native code; \n }. Wystarczy potraktować je
Function.prototype.toString, żeby zabezpieczyć się przed własną implementacją tej metody, i voila.
require('reflect-r').isBoundOrNativeFunction(func)Z tym, że właśnie myślę na czym bardziej bazować czy JS czy CSS. Oba tak naprawdę równie łatwo