Wie erkenne ich einen Safari-Browser mit JavaScript? Ich habe den folgenden Code ausprobiert und er erkennt nicht nur Safari, sondern auch den Chrome-Browser.
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
Antworten:
Sie können den Chrome-Index ganz einfach verwenden, um Chrome herauszufiltern:
quelle
Hinweis: Versuchen Sie immer, das spezifische Verhalten zu erkennen, das Sie beheben möchten, anstatt es gezielt einzusetzen
isSafari?
Als letzten Ausweg erkennen Sie Safari mit diesem regulären Ausdruck:
Es verwendet negative Look-arounds und schließt Chrome, Edge und alle Android-Browser aus, die den
Safari
Namen in ihrem Benutzeragenten enthalten.quelle
Wie bereits erwähnt, wird die Funktionserkennung der Suche nach einem bestimmten Browser vorgezogen. Ein Grund ist, dass die Benutzeragentenzeichenfolge geändert werden kann. Ein weiterer Grund ist, dass sich die Zeichenfolge in neueren Versionen möglicherweise ändert und Ihren Code beschädigt.
Wenn Sie es dennoch tun und auf eine Safari-Version testen möchten, würde ich empfehlen, diese zu verwenden
Dies funktioniert mit jeder Version von Safari auf allen Geräten: Mac, iPhone, iPod, iPad.
Bearbeiten
So testen Sie in Ihrem aktuellen Browser: https://jsfiddle.net/j5hgcbm2/
Bearbeiten 2
Aktualisiert gemäß Chrome-Dokumenten , um Chrome unter iOS korrekt zu erkennen
Es ist erwähnenswert, dass alle Browser unter iOS nur Wrapper für Safari sind und dieselbe Engine verwenden. Siehe den Kommentar von bfred.it zu seiner eigenen Antwort in diesem Thread.
Bearbeiten 3
Aktualisiert gemäß den Firefox-Dokumenten , um Firefox unter iOS korrekt zu erkennen
quelle
isSafari
wird sonsttrue
in einem Safari-Browser seinfalse
. Sie können einfach das obige Snippet verwenden und dann Ihr Snippet fast so verwenden, wie Sie es gepostet haben.if (isSafari) { do_this(); } else { do_that(); }
.&& !navigator.userAgent.match('FxiOS')
ähnlich wie die Chrome-Prüfung hinzufügen - ref ( developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/… )Benutz einfach:
quelle
getUserMedia
.Dieser Code wird verwendet, um nur Safari-Browser zu erkennen
quelle
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36 OPR/24.0.1558.51 (Edition Next)
oder Stock Android Browser:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
Da userAgent für Chrome und Safari nahezu identisch sind, kann es einfacher sein, den Anbieter des Browsers zu ermitteln
Safari
Chrom
FireFox (warum ist es leer?)
IE (warum ist es undefiniert?)
quelle
Nur Safari ohne Chrome:
Nachdem ich andere Codes ausprobiert hatte, fand ich keine, die mit neuen und alten Versionen von Safari funktioniert.
Schließlich habe ich diesen Code gemacht, der für mich sehr gut funktioniert:
quelle
Ich habe festgestellt, dass nur ein Wort Safari unterscheidet - "Version". Dieser Regex wird also perfekt funktionieren:
quelle
Ich weiß nicht, warum das OP Safari erkennen wollte, aber in seltenen Fällen ist es heutzutage wahrscheinlich wichtiger, die Render-Engine zu erkennen als den Namen des Browsers. Unter iOS verwenden beispielsweise alle Browser die Safari / Webkit-Engine. Daher ist es sinnlos, "Chrome" oder "Firefox" als Browsernamen zu verwenden, wenn der zugrunde liegende Renderer tatsächlich Safari / Webkit ist. Ich habe diesen Code nicht mit alten Browsern getestet, aber er funktioniert mit allem, was unter Android, iOS, OS X, Windows und Linux ziemlich neu ist.
Zu klären:
quelle
ich benutze das
quelle
Einfachste Antwort:
quelle
navigator.vendor.toLowerCase().indexOf('apple') > -1
if (navigator.vendor.match(/apple/i)) { ... }
.Für die Datensätze ist der sicherste Weg, den ich gefunden habe, den Safari-Teil des Browser-Erkennungscodes aus dieser Antwort zu implementieren :
Der beste Weg, um mit browserspezifischen Problemen umzugehen, ist natürlich immer die Feature-Erkennung, wenn dies überhaupt möglich ist. Die Verwendung eines Codeteils wie des oben genannten ist jedoch immer noch besser als die Erkennung von Agentenzeichenfolgen.
quelle
Ich weiß, dass diese Frage alt ist, aber ich dachte trotzdem daran, die Antwort zu veröffentlichen, da sie jemandem helfen könnte. Die oben genannten Lösungen scheiterten in einigen Randfällen, sodass wir sie so implementieren mussten, dass iOS, Desktop und andere Plattformen separat behandelt werden.
quelle
Modifizierter regulärer Ausdruck für die Antwort oben
quelle
Dieses einzigartige "Problem" ist ein 100% iges Zeichen dafür, dass es sich bei dem Browser um Safari handelt (ob Sie es glauben oder nicht).
Dies bedeutet, dass der Cookie-Objektdeskriptor auf Safari auf false gesetzt ist, während auf allen anderen true, was mir beim anderen Projekt tatsächlich Kopfschmerzen bereitet. Viel Spaß beim Codieren!
quelle
Vielleicht funktioniert das:
EDIT: NICHT MEHR ARBEITEN
quelle
Ich erstelle eine Funktion, die einen booleschen Typ zurückgibt:
quelle
Das Schnüffeln von Benutzeragenten ist wirklich schwierig und unzuverlässig. Wir haben versucht, Safari unter iOS mit der obigen Antwort von @ qingu zu erkennen. Für Safari, Chrome und Firefox hat es ziemlich gut funktioniert. Aber es hat Opera und Edge fälschlicherweise als Safari erkannt.
Daher haben wir uns für die Feature-Erkennung entschieden, die ab heute
serviceWorker
nur in Safari und in keinem anderen Browser unter iOS unterstützt wird. Wie in https://jakearchibald.github.io/isserviceworkerready/ angegebenAlso haben wir so etwas gemacht
Hinweis : Nicht unter Safari unter MacOS getestet.
quelle