jQuery를 사용하여 Safari 감지


111

둘 다 Webkit 기반 브라우저이지만 Safari는 URL에 따옴표를 urlencode하지만 Chrome은 그렇지 않습니다.

따라서 JS에서이 둘을 구분해야합니다.

jQuery의 브라우저 감지 문서는 "safari"를 사용되지 않음으로 표시합니다.

더 나은 방법이 있습니까 아니면 지금은 사용되지 않는 값을 고수합니까?


나는 그것을 고수하는 것이 그렇게 좋은 생각인지 모르겠지만, 나는 크롬에서 $ .browser 문서를 탐색하고 플래그를 지정했지만 이것을 자세히 확인하지 않았습니다 $.browser.safari === true. eeek.
davin

1
사용자 에이전트 스니핑없이 Safari, Chrome, IE, Firefox 및 Opera 브라우저를 감지하는 방법의 중복 가능성 ?.
Rob W

답변:


340

feature detectionUseragent문자열 혼합 사용 :

    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 2013-09-05

1
이러한 종류가 얼마나 취약한 지 보여주는 예로서이 코드는 UA 문자열이 변경 되었기 때문에 Internet Explorer 11을 감지하지 못합니다. 참조 msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx
올리 호지 슨에게

1
안드로이드 웹보기는 사파리를 말할 것이다 그것은 올바른 아니에요
커티스

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 2011-06-16

12
기능 감지는 훌륭하지만 버그가있는 구현이 있기 때문에 특정 브라우저가 CSS 애니메이션 (예 :)을 사용하지 못하게하려면 어떻게해야합니까? 기술적으로는 기능을 지원하지만 해당 브라우저에 대해 비활성화하기로 결정하고 싶습니다. 해당 인스턴스가 없으면 경험이 더 좋기 때문입니다.
Phil Ricketts


0

이 문제를 해결하는 매우 유용한 방법은 브라우저 웹킷 버전을 감지하고 필요한 버전인지 확인하고 다른 작업을 수행하는 것입니다.

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

이는 브라우저의 다양한 웹킷 구현 문제를 처리하기위한 안전하고 영구적 인 수정을 제공합니다.

즐거운 코딩 되세요!


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

0

일반 기능

 var getBrowseActive = function (browserName) {
   return navigator.userAgent.indexOf(browserName) > -1;
 };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.