Safari'yi jQuery kullanarak algıla


111

Her ikisi de Webkit tabanlı tarayıcılar olsa da, Safari urlencode URL'de tırnak işaretleri oluştururken Chrome bunu yapmaz.

Bu nedenle JS'de bu ikisini birbirinden ayırmam gerekiyor.

jQuery'nin tarayıcı algılama belgeleri "safari" yi kullanımdan kaldırıldı olarak işaretler.

Daha iyi bir yöntem var mı yoksa şimdilik sadece kullanımdan kaldırılan değere bağlı mıyım?


Buna bağlı kalmanın bu kadar iyi bir fikir olup olmadığını bilmiyorum, bunu derinlemesine kontrol etmedim, ancak chrome'daki $ .browser belgelerine ve bayraklarına baktım $.browser.safari === true. eeek.
davin

1
Kullanıcı aracısı koklamadan Safari, Chrome, IE, Firefox ve Opera tarayıcısının olası kopyası nasıl tespit edilir ?
Rob W

Yanıtlar:


340

Bir dizi feature detectionve Useragentdizeyi kullanarak :

    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);

Kullanımı:
if (is_safari) alert('Safari');

Veya yalnızca Safari için şunu kullanın:

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

3
Yan etkileri olan bir özellik tespiti için 48 oy ve 5 oy oranıyla, görünüşe göre bu önerilen çözümdür. :) Cevap kabul edildi.
AndreKR

1
Bu tür bir şeyin ne kadar kırılgan olduğuna bir örnek olarak, UA dizesi değiştiği için bu kod Internet Explorer 11'i algılamaz. Bkz msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx
Olly Hodgson

1
Android web görünümünde Safari de yazacak ve bu doğru değil
Curtis

15
Chrome / Windows, Safari olarak bildirilecek:(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) IE11 >>> stackoverflow.com/a/22242528/2049986'yı
Jacob van Lingen

74

Aşağıdakiler Safari 3.0+ 'ı tanımlar ve onu Chrome'dan ayırır:

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

1
Olay bu. TNX!
Eugen Sunic

10

ne yazık ki yukarıdaki örnekler, android'in varsayılan tarayıcısını Safari olarak algılayacaktır, ki öyle değildir. kullandım navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1


7

Safari'yi kontrol etmek için şunu kullandım:

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

Doğru çalışıyor.


3

Görünüşe göre tek güvenilir ve kabul edilen çözüm şu şekilde özellik algılaması yapmak olacaktır:

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
Güzel numara, ama maalesef işe yaramıyor. Eşitlik (location.hash == '#% 22blah% 22'), location.hash'ın dizeyi işleme biçimi nedeniyle çalışmayacaktır. : /
Panos Kal.

1
Özellik algılama, gidilecek yoldur, ancak herhangi bir yan etkisi olmayan daha iyi bir yöntem var. Snippet'iniz, karma değişiklik etkinliklerine dayanan diğer komut dosyalarıyla çakışabilir. Ben bir kopyası olarak soru işaretledim bu . Yöntemi Safari 3.0 - 5.1.3'te (Mac ve Windows) oluşturdum ve test ettim. Bu tek satırlık bir :)
Rob W,

2

Bulduğum tek yol navigator.userAgent'ın iPhone veya iPad kelimesi içerip içermediğini kontrol etmektir.

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

1

Tarayıcı kullanımını kontrol ediyorsanız $.browser. Ancak özellik desteğini kontrol ediyorsanız (önerilir), o zaman kullanın $.support.

Sayfadaki özellikleri etkinleştirmek / devre dışı bırakmak için $ .browser KULLANMAMALISINIZ. Nedeni güvenilir olmaması ve genellikle tavsiye edilmemesi.

Özellik desteğine ihtiyacınız varsa, modernizr'i öneririm .


Bir adama balık tutmayı öğretin ... "Daha iyi bir yöntem var mı" - Evet, özellik algılama.
John Strickler

Gibi bir şey location.hash = '"blah"'; if (location.hash == '#%22blah%22') alert('is Safari');mi demek istiyorsun ?
AndreKR

@AndreKR Kesinlikle, özellikle kontrol ettiğiniz özelliği test etmek için bir işlev yapacağım.
John Strickler

2
@Greg Tarayıcıya sormuyorsunuz .. tarayıcıyı test ediyorsunuz.
John Strickler

12
Özellik algılama harika, ancak belirli bir tarayıcının (örneğin) hatalı bir uygulaması olduğu için CSS Animasyonlarını kullanmasını durdurmak istediğinizde ne olacak? Teknik olarak özelliği destekliyor, ancak bu tarayıcı için devre dışı bırakma kararı almak istiyoruz, çünkü bu durumda deneyim daha iyi.
Phil Ricketts


0

Bunu düzeltmenin çok yararlı bir yolu, tarayıcıların webkit sürümünü tespit etmek ve en azından ihtiyacımız olanı kontrol etmek, yoksa başka bir şey yapmaktır.

JQuery kullanmak şu şekilde olur:

"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.");
    };
});

Bu, tarayıcının farklı webkit uygulamalarıyla ilgili sorunların üstesinden gelmek için güvenli ve kalıcı bir düzeltme sağlar.

Mutlu kodlamalar!


0

Bu, tarayıcının Safari olup olmadığını belirleyecektir.

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

Maalesef çalışmıyor. Chrome v66 ve Safari'de test edilmiştir.
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

Apple tarayıcı motorunu tespit etmek için kullanıyorum, bu basit JavaScript koşulu:

 navigator.vendor.startsWith('Apple')

0

Genel FONKSİYON

 var getBrowseActive = function (browserName) {
   return navigator.userAgent.indexOf(browserName) > -1;
 };
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.