ตรวจหา Safari โดยใช้ jQuery


111

แม้ว่าทั้งสองจะเป็นเบราว์เซอร์ที่ใช้ Webkit แต่ Safari urlencodes อัญประกาศใน URL ในขณะที่ Chrome ไม่มี

ดังนั้นฉันต้องแยกความแตกต่างระหว่างสองสิ่งนี้ใน JS

เอกสารการตรวจหาเบราว์เซอร์ของ jQueryทำเครื่องหมาย "ซาฟารี" ว่าเลิกใช้แล้ว

มีวิธีที่ดีกว่านี้หรือฉันแค่ยึดติดกับค่าที่เลิกใช้ไปแล้วในตอนนี้


ผมไม่ทราบว่าถ้าติดกับมันเป็นเช่นความคิดที่ดีผมยังไม่ได้ตรวจสอบในเชิงลึก แต่ฉันเพียงแค่เรียกดูไปยังเอกสาร $ .browser $.browser.safari === trueในโครเมี่ยมและธง Eeek
davin

1
ซ้ำเป็นไปได้ของวิธีการตรวจสอบ Safari, Chrome, IE, Firefox และ Opera เบราว์เซอร์ โดยไม่ต้องดมตัวแทนของผู้ใช้ ?
Rob W

คำตอบ:


340

ใช้การผสมผสานfeature detectionและUseragentสตริง:

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

การใช้งาน:
if (is_safari) alert('Safari');

หรือสำหรับ Safari เท่านั้นให้ใช้สิ่งนี้:

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

3
ด้วยอัตราส่วน 48 โหวตเทียบกับ 5 โหวตสำหรับการตรวจจับคุณสมบัติที่มีผลข้างเคียงเห็นได้ชัดว่านี่เป็นวิธีแก้ปัญหาที่แนะนำ :) ทำให้เป็นที่ยอมรับคำตอบ
AndreKR

1
เป็นตัวอย่างของความเปราะบางของสิ่งนี้รหัสนี้ตรวจไม่พบ Internet Explorer 11 เนื่องจากสตริง UA มีการเปลี่ยนแปลง ดูmsdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx
Olly Hodgson

1
Android webview จะบอกว่า Safari และนั่นไม่ถูกต้อง
Curtis

15
Chrome / Windows จะรายงานเป็น 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) เพื่อรองรับ IE11 >>> stackoverflow.com/a/22242528/2049986
Jacob van Lingen

74

ข้อมูลต่อไปนี้ระบุ Safari 3.0+ และแยกความแตกต่างจาก Chrome:

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

1
นี่คือสิ่งที่ TNX!
Eugen Sunic

10

น่าเสียดายที่ตัวอย่างข้างต้นจะตรวจพบเบราว์เซอร์เริ่มต้นของ Android เป็น Safari ซึ่งไม่ใช่ ฉันใช้ navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1


7

สำหรับการตรวจสอบ Safari ฉันใช้สิ่งนี้:

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

มันทำงานได้อย่างถูกต้อง


3

เห็นได้ชัดว่าโซลูชันเดียวที่เชื่อถือได้และได้รับการยอมรับคือทำการตรวจจับคุณสมบัติเช่นนี้:

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
เคล็ดลับที่ดี แต่น่าเสียดายที่ไม่ได้ผล ความเท่าเทียมกัน (location.hash == '#% 22blah% 22') จะไม่ทำงานเนื่องจากวิธีการ location.hash ปฏิบัติต่อสตริง : /
Panos Kal.

1
การตรวจจับคุณสมบัติเป็นวิธีที่จะไป แต่มีวิธีที่ดีกว่าซึ่งไม่มีผลข้างเคียงใด ๆ ข้อมูลโค้ดของคุณอาจรบกวนสคริปต์อื่น ๆ ที่อาศัยเหตุการณ์การเปลี่ยนแปลงแฮช ฉันได้ทำเครื่องหมายคำถามเป็นซ้ำนี้ ฉันได้สร้างและทดสอบวิธีการใน Safari 3.0 - 5.1.3 (Mac และ Windows) เป็นซับ
Rob W

2

วิธีเดียวที่ฉันพบคือตรวจสอบว่า navigator.userAgent มีคำว่า iPhone หรือ iPad หรือไม่

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

1

$.browserหากคุณกำลังตรวจสอบการใช้งานเบราว์เซอร์ แต่ถ้าคุณกำลังตรวจสอบการสนับสนุนคุณลักษณะ (แนะนำ) $.supportการใช้งานแล้ว

คุณไม่ควรใช้ $ .browser เพื่อเปิด / ปิดคุณสมบัติบนเพจ เหตุผลที่ไม่น่าเชื่อถือและโดยทั่วไปไม่แนะนำ

หากคุณต้องการการสนับสนุนคุณสมบัติแล้วฉันขอแนะนำModernizr


สอนผู้ชายตกปลา ... "มีวิธีที่ดีกว่านี้" - ใช่การตรวจจับคุณลักษณะ
John Strickler

คุณหมายถึงอะไรlocation.hash = '"blah"'; if (location.hash == '#%22blah%22') alert('is Safari');?
AndreKR

@AndreKR แน่นอนฉันจะสร้างฟังก์ชันเพื่อทดสอบคุณสมบัติที่คุณกำลังตรวจสอบโดยเฉพาะ
John Strickler

2
@Greg คุณไม่ได้ถามเบราว์เซอร์ .. คุณกำลังทดสอบเบราว์เซอร์
John Strickler

12
การตรวจจับคุณลักษณะนั้นยอดเยี่ยม แต่ถ้าคุณต้องการหยุดเบราว์เซอร์บางตัวไม่ให้ใช้ CSS Animations (เช่น) เนื่องจากมีการใช้งานบั๊กกี้? ในทางเทคนิคสนับสนุนคุณลักษณะนี้ แต่เราต้องการตัดสินใจปิดการใช้งานสำหรับเบราว์เซอร์นั้นเนื่องจากประสบการณ์จะดีกว่าหากไม่มีในอินสแตนซ์นั้น
Phil Ricketts


0

วิธีที่มีประโยชน์มากในการแก้ไขปัญหานี้คือการตรวจหาเวอร์ชัน webkit ของเบราว์เซอร์และตรวจสอบว่าเป็นเวอร์ชันที่เราต้องการอย่างน้อยหรือไม่ควรทำอย่างอื่น

การใช้ jQuery จะเป็นดังนี้:

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

นี่เป็นการแก้ไขที่ปลอดภัยและถาวรสำหรับการจัดการกับปัญหาเกี่ยวกับการใช้งาน webkit ต่างๆของเบราว์เซอร์

ขอให้สนุกกับการเขียนโค้ด!


0

สิ่งนี้จะกำหนดว่าเบราว์เซอร์เป็น Safari หรือไม่

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

ไม่ได้ผลน่าเสียดาย ทดสอบบน Chrome v66 และ 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

ฉันใช้เพื่อตรวจจับเอ็นจิ้นเบราว์เซอร์ของ Apple เงื่อนไข JavaScript ง่ายๆนี้:

 navigator.vendor.startsWith('Apple')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.