Phát hiện Safari bằng jQuery


111

Mặc dù cả hai đều là trình duyệt dựa trên Webkit, Safari urlencodes dấu ngoặc kép trong URL trong khi Chrome thì không.

Do đó tôi cần phân biệt giữa hai điều này trong JS.

Tài liệu phát hiện trình duyệt của jQuery đánh dấu "safari" là không được dùng nữa.

Có phương pháp nào tốt hơn không hay bây giờ tôi chỉ gắn bó với giá trị không dùng nữa?


Tôi không biết gắn bó với nó có phải là một ý tưởng hay hay không, tôi chưa kiểm tra kỹ vấn đề này, mặc dù tôi vừa duyệt qua tài liệu $ .browser trên chrome và nó gắn cờ $.browser.safari === true. eeek.
davin

1
có thể trùng lặp của Làm thế nào để phát hiện trình duyệt Safari, Chrome, IE, Firefox và Opera mà không có tác nhân người dùng phát hiện ?.
Rob W

Câu trả lời:


340

Sử dụng kết hợp của feature detectionUseragentchuỗi:

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

Sử dụng:
if (is_safari) alert('Safari');

Hoặc chỉ dành cho Safari, hãy sử dụng cái này:

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

3
Với tỷ lệ 48 phiếu bầu so với 5 phiếu bầu cho một tính năng phát hiện có tác dụng phụ, rõ ràng đây là giải pháp được khuyến nghị. :) Làm cho nó được chấp nhận câu trả lời.
AndreKR

1
Như một ví dụ về mức độ mong manh của thứ này, mã này không phát hiện được Internet Explorer 11 vì chuỗi UA đã thay đổi. Xem msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx
Olly Hodgson

1
Android webview cũng sẽ nói Safari và đó là không đúng
Curtis

15
Chrome / Windows sẽ báo cáo dưới dạng 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) cũng hỗ trợ IE11 >>> stackoverflow.com/a/22242528/2049986
Jacob van Lingen

74

Phần sau xác định Safari 3.0+ và phân biệt nó với Chrome:

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

1
Đây là điều. TNXP!
Eugen Sunic

10

Thật không may, các ví dụ trên cũng sẽ phát hiện trình duyệt mặc định của Android là Safari, nhưng không phải vậy. Tôi đã sử dụng navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1


7

Để kiểm tra Safari, tôi đã sử dụng cái này:

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

Nó hoạt động chính xác.


3

Rõ ràng giải pháp đáng tin cậy và được chấp nhận duy nhất là phát hiện tính năng như sau:

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
Mẹo hay, nhưng tiếc là nó không hoạt động. Đẳng thức (location.hash == '#% 22blah% 22') sẽ không hoạt động do cách location.hash xử lý chuỗi. : /
Panos Kal.

1
Phát hiện tính năng là một cách để đi, nhưng có một phương pháp tốt hơn mà không có bất kỳ tác dụng phụ nào. Đoạn mã của bạn có thể can thiệp vào các tập lệnh khác dựa vào các sự kiện thay đổi băm. Tôi đã đánh dấu câu hỏi là một bản sao của câu hỏi này . Tôi đã tạo và thử nghiệm phương pháp này trong Safari 3.0 - 5.1.3 (Mac và Windows). Đó là một lớp lót :)
Rob W

2

Cách duy nhất tôi tìm thấy là kiểm tra xem điều hướng.userAgent có chứa từ iPhone hoặc iPad không

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

1

Nếu bạn đang kiểm tra việc sử dụng trình duyệt $.browser. Nhưng nếu bạn đang kiểm tra hỗ trợ tính năng (được khuyến nghị) thì hãy sử dụng $.support.

Bạn KHÔNG nên sử dụng $ .browser để bật / tắt các tính năng trên trang. Lý do không đáng tin cậy và thường không được khuyến khích.

Nếu bạn cần hỗ trợ tính năng thì tôi khuyên bạn nên dùng modernizr .


Dạy một người câu cá ... "Có phương pháp nào tốt hơn không" - Có, tính năng phát hiện.
John Strickler

Ý bạn là như thế location.hash = '"blah"'; if (location.hash == '#%22blah%22') alert('is Safari');nào?
AndreKR

@AndreKR Chính xác, tôi muốn tạo một chức năng để kiểm tra cụ thể tính năng bạn đang kiểm tra.
John Strickler

2
@Greg Bạn không hỏi trình duyệt .. bạn đang kiểm tra trình duyệt.
John Strickler

12
Tính năng phát hiện là rất tốt, nhưng khi bạn muốn ngăn một trình duyệt cụ thể sử dụng CSS Animations (ví dụ), vì nó có một triển khai lỗi thì sao? Về mặt kỹ thuật, nó hỗ trợ tính năng này, nhưng chúng tôi muốn đưa ra quyết định tắt nó cho trình duyệt đó, vì trải nghiệm tốt hơn nếu không có trong trường hợp đó.
Phil Ricketts


0

Một cách rất hữu ích để khắc phục điều này là phát hiện phiên bản webkit của trình duyệt và kiểm tra xem nó có ít nhất là phiên bản chúng ta cần hay không, nếu không hãy làm điều gì đó khác.

Sử dụng jQuery nó sẽ như thế này:

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

Điều này cung cấp một bản sửa lỗi an toàn và vĩnh viễn để giải quyết các sự cố với các triển khai bộ web khác nhau của trình duyệt.

Chúc bạn viết mã vui vẻ!


0

Điều này sẽ xác định xem trình duyệt có phải là Safari hay không.

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

Rất tiếc, không hoạt động. Đã thử nghiệm trên Chrome v66 và 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

Tôi sử dụng để phát hiện công cụ trình duyệt của Apple, điều kiện JavaScript đơn giản này:

 navigator.vendor.startsWith('Apple')

0

CHỨC NĂNG Chung

 var getBrowseActive = function (browserName) {
   return navigator.userAgent.indexOf(browserName) > -1;
 };
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.