Rileva Safari utilizzando jQuery


111

Sebbene entrambi siano browser basati su Webkit, l'URL di Safari codifica le virgolette nell'URL mentre Chrome no.

Pertanto ho bisogno di distinguere tra questi due in JS.

I documenti di rilevamento del browser di jQuery contrassegnano "safari" come deprecato.

C'è un metodo migliore o per ora mi limito al valore deprecato?


Non so se mantenerlo sia una buona idea, non l'ho verificato in profondità, anche se ho appena sfogliato i documenti $ .browser su Chrome e viene contrassegnato $.browser.safari === true. Eeek.
davin

1
possibile duplicato di Come rilevare i browser Safari, Chrome, IE, Firefox e Opera senza lo sniffing dell'agente utente ?.
Rob W

Risposte:


340

Usando un mix di feature detectione Useragentstring:

    var is_opera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    var is_Edge = navigator.userAgent.indexOf("Edge") > -1;
    var is_chrome = !!window.chrome && !is_opera && !is_Edge;
    var is_explorer= typeof document !== 'undefined' && !!document.documentMode && !is_Edge;
    var is_firefox = typeof window.InstallTrigger !== 'undefined';
    var is_safari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);

Uso:
if (is_safari) alert('Safari');

O solo per Safari, usa questo:

if ( /^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {alert('Its Safari');}

3
Con un rapporto di 48 voti contro 5 voti per un rilevamento di funzionalità con effetti collaterali, a quanto pare questa è la soluzione consigliata. :) Rendendolo risposta accettata.
AndreKR

1
Come esempio di quanto sia fragile questo genere di cose, questo codice non rileva Internet Explorer 11 perché la stringa UA è cambiata. Vedi msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx
Olly Hodgson

1
Anche la visualizzazione web di Android dirà Safari e non è corretto
Curtis

15
Chrome / Windows riporterà come Safari:(Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36)
Blaise

6
is_explorer = (navigator.userAgent.indexOf ( 'MSIE')! == -1 || navigator.appVersion.indexOf ( 'Trident /')> 0) per supportare anche IE11 >>> stackoverflow.com/a/22242528/2049986
Jacob van Lingen

74

Quanto segue identifica Safari 3.0+ e lo distingue da Chrome:

isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)

1
Questa è la cosa. TNX!
Eugen Sunic

10

sfortunatamente gli esempi precedenti rileveranno anche il browser predefinito di Android come Safari, cosa che non è. ero solito navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1


7

Per controllare Safari ho usato questo:

$.browser.safari = ($.browser.webkit && !(/chrome/.test(navigator.userAgent.toLowerCase())));
if ($.browser.safari) {
    alert('this is safari');
}

Funziona correttamente.


3

Apparentemente l'unica soluzione affidabile e accettata sarebbe quella di eseguire il rilevamento delle funzionalità in questo modo:

browser_treats_urls_like_safari_does = false;
var last_location_hash = location.hash;
location.hash = '"blah"';
if (location.hash == '#%22blah%22')
    browser_treats_urls_like_safari_does = true;
location.hash = last_location_hash;

2
Bel trucco, ma purtroppo non funziona. L'uguaglianza (location.hash == '#% 22blah% 22') non funzionerà a causa del modo in cui location.hash tratta la stringa. : /
Panos Kal.

1
Il rilevamento delle funzionalità è la strada da percorrere, ma esiste un metodo migliore che non ha effetti collaterali. Lo snippet potrebbe interferire con altri script che si basano su eventi di modifica hash. Ho contrassegnato la domanda come un duplicato di questo . Ho creato e testato il metodo in Safari 3.0 - 5.1.3 (Mac e Windows). È una battuta :)
Rob W

2

L'unico modo che ho trovato è controllare se navigator.userAgent contiene parole per iPhone o iPad

if (navigator.userAgent.toLowerCase().match(/(ipad|iphone)/)) {
    //is safari
}

1

Se stai controllando l'utilizzo del browser $.browser. Ma se stai controllando il supporto delle funzionalità (consigliato), usa $.support.

NON usare $ .browser per abilitare / disabilitare le funzionalità sulla pagina. Il motivo è che non è affidabile e generalmente non è consigliato.

Se hai bisogno di supporto per le funzionalità, ti consiglio modernizr .


Insegna a un uomo a pescare ... "Esiste un metodo migliore" - Sì, rilevamento delle caratteristiche.
John Strickler

Intendi qualcosa di simile location.hash = '"blah"'; if (location.hash == '#%22blah%22') alert('is Safari');?
AndreKR

@AndreKR Esattamente, creerei una funzione per testare specificamente la funzionalità che stai cercando.
John Strickler

2
@Greg Non stai chiedendo al browser .. stai testando il browser.
John Strickler

12
Il rilevamento delle funzionalità è ottimo, ma cosa succede quando si desidera impedire a un determinato browser di utilizzare le animazioni CSS (ad esempio), perché ha un'implementazione difettosa? Tecnicamente supporta la funzione, ma vogliamo decidere di disabilitarla per quel browser, perché l'esperienza è migliore senza in quel caso.
Phil Ricketts,


0

Un modo molto utile per risolvere questo problema è rilevare la versione del webkit del browser e verificare se è almeno quella di cui abbiamo bisogno, altrimenti fare qualcos'altro.

Usando jQuery funziona così:

"use strict";

$(document).ready(function() {
    var appVersion                  = navigator.appVersion;
    var webkitVersion_positionStart = appVersion.indexOf("AppleWebKit/") + 12;
    var webkitVersion_positionEnd   = webkitVersion_positionStart + 3;
    var webkitVersion               = appVersion.slice(webkitVersion_positionStart, webkitVersion_positionEnd);
	
    console.log(webkitVersion);

    if (webkitVersion < 537) {
        console.log("webkit outdated.");
    } else {
        console.log("webkit ok.");
    };
});

Ciò fornisce una soluzione sicura e permanente per affrontare i problemi con le diverse implementazioni del webkit del browser.

Buona programmazione!


0

Questo determinerà se il browser è Safari o meno.

if(navigator.userAgent.indexOf('Safari') !=-1 && navigator.userAgent.indexOf('Chrome') == -1)
{
    alert(its safari);
}else {
    alert('its not safari');
}

Purtroppo non funziona. Testato su Chrome v66 e Safari.
Jonathan Arbely

0
    // Safari uses pre-calculated pixels, so use this feature to detect Safari
    var canva = document.createElement('canvas');
    var ctx = canva.getContext("2d");
    var img = ctx.getImageData(0, 0, 1, 1);
    var pix = img.data;     // byte array, rgba
    var isSafari = (pix[3] != 0);   // alpha in Safari is not zero

0

Uso per rilevare il motore del browser Apple, questa semplice condizione JavaScript:

 navigator.vendor.startsWith('Apple')

0

FUNZIONE generica

 var getBrowseActive = function (browserName) {
   return navigator.userAgent.indexOf(browserName) > -1;
 };
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.