JavaScript를 사용하여 Safari 브라우저를 감지하는 방법? 아래 코드를 시도했는데 Safari뿐만 아니라 Chrome 브라우저도 감지합니다.
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
JavaScript를 사용하여 Safari 브라우저를 감지하는 방법? 아래 코드를 시도했는데 Safari뿐만 아니라 Chrome 브라우저도 감지합니다.
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
답변:
Chrome 색인을 사용하여 Chrome을 쉽게 필터링 할 수 있습니다.
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('safari') != -1) {
if (ua.indexOf('chrome') > -1) {
alert("1") // Chrome
} else {
alert("2") // Safari
}
}
참고 : 수정하려는 특정 행동을 항상 타겟팅하지 말고 감지하십시오.isSafari?
최후의 수단 으로이 정규식으로 Safari를 감지하십시오.
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
부정적인 둘러보기를 사용하며 Chrome, Edge 및 Safari
사용자 에이전트에 이름 을 포함하는 모든 Android 브라우저를 제외합니다 .
다른 사람들이 이미 언급했듯이 기능 검색은 특정 브라우저를 확인하는 것보다 선호됩니다. 한 가지 이유는 사용자 에이전트 문자열을 변경할 수 있기 때문입니다. 또 다른 이유는 문자열이 최신 버전에서 코드를 변경하고 중단시킬 수 있기 때문입니다.
그래도 Safari 버전을 테스트하고 싶다면 이것을 사용하는 것이 좋습니다.
var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 &&
navigator.userAgent &&
navigator.userAgent.indexOf('CriOS') == -1 &&
navigator.userAgent.indexOf('FxiOS') == -1;
Mac, iPhone, iPod, iPad 등 모든 장치에서 Safari의 모든 버전에서 작동합니다.
현재 브라우저에서 테스트하려면 https://jsfiddle.net/j5hgcbm2/
iOS에서 Chrome을 올바르게 감지 하도록 Chrome 문서 에 따라 업데이트되었습니다.
iOS의 모든 브라우저는 Safari의 래퍼 일 뿐이며 동일한 엔진을 사용한다는 점은 주목할 가치가 있습니다. 이 글에서 자신의 답변에 대한 bfred.it의 의견을 참조하십시오.
iOS에서 Firefox를 올바르게 감지 하도록 Firefox 문서 에 따라 업데이트되었습니다.
isSafari
것 true
, 사파리 브라우저에서 false
그렇지. 위의 스 니펫을 사용하고 게시 한 그대로 사용할 수 있습니다. if (isSafari) { do_this(); } else { do_that(); }
.
&& !navigator.userAgent.match('FxiOS')
경우 Chrome check-ref ( developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/… ) 와 유사하게 추가 할 수 있습니다.
그냥 사용하십시오 :
var isSafari = window.safari !== undefined;
if (isSafari) console.log("Safari, yeah!");
getUserMedia
.
이 코드는 사파리 브라우저 만 감지하는 데 사용됩니다
if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0)
{
alert("Browser is Safari");
}
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36 OPR/24.0.1558.51 (Edition Next)
또는 Stock Android 브라우저 :Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
chrome 및 safari 용 userAgent가 거의 동일하므로 브라우저 공급 업체를보다 쉽게 확인할 수 있습니다.
원정 여행
navigator.vendor == "Apple Computer, Inc."
크롬
navigator.vendor == "Google Inc."
FireFox (비어있는 이유는 무엇입니까?)
navigator.vendor == ""
IE (왜 정의되지 않습니까?)
navigator.vendor == undefined
사파리 whitout 크롬 만 :
다른 코드를 시도한 후에 새롭고 오래된 버전의 Safari에서 작동하는 코드를 찾지 못했습니다.
마지막 으로이 코드가 저에게 매우 효과적입니다.
var ua = navigator.userAgent.toLowerCase();
var isSafari = false;
try {
isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);
}
catch(err) {}
isSafari = (isSafari || ((ua.indexOf('safari') != -1)&& (!(ua.indexOf('chrome')!= -1) && (ua.indexOf('version/')!= -1))));
//test
if (isSafari)
{
//Code for Safari Browser (Desktop and Mobile)
document.getElementById('idbody').innerHTML = "This is Safari!";
}
else
{
document.getElementById('idbody').innerHTML = "Not is Safari!";
}
<body id="idbody">
</body>
사파리를 구별하는 단어는 "버전"입니다. 따라서이 정규식은 완벽하게 작동합니다.
/.*Version.*Safari.*/.test(navigator.userAgent)
OP가 Safari를 감지하려는 이유를 모르겠지만, 드물게 요즘 브라우저 스니핑이 필요합니다. 브라우저 이름보다 렌더 엔진을 감지하는 것이 더 중요합니다. 예를 들어 iOS에서 모든 브라우저는 Safari / Webkit 엔진을 사용하므로 기본 렌더러가 실제로 Safari / Webkit 인 경우 브라우저 이름으로 "chrome"또는 "firefox"를 얻는 것은 의미가 없습니다. 이전 브라우저 에서이 코드를 테스트하지는 않았지만 Android, iOS, OS X, Windows 및 Linux에서 상당히 최신의 모든 것과 작동합니다.
<script>
let browserName = "";
if(navigator.vendor.match(/google/i)) {
browserName = 'chrome/blink';
}
else if(navigator.vendor.match(/apple/i)) {
browserName = 'safari/webkit';
}
else if(navigator.userAgent.match(/firefox\//i)) {
browserName = 'firefox/gecko';
}
else if(navigator.userAgent.match(/edge\//i)) {
browserName = 'edge/edgehtml';
}
else if(navigator.userAgent.match(/trident\//i)) {
browserName = 'ie/trident';
}
else
{
browserName = navigator.userAgent + "\n" + navigator.vendor;
}
alert(browserName);
</script>
명확히하기 위해 :
나는 이것을 사용한다
function getBrowserName() {
var name = "Unknown";
if(navigator.userAgent.indexOf("MSIE")!=-1){
name = "MSIE";
}
else if(navigator.userAgent.indexOf("Firefox")!=-1){
name = "Firefox";
}
else if(navigator.userAgent.indexOf("Opera")!=-1){
name = "Opera";
}
else if(navigator.userAgent.indexOf("Chrome") != -1){
name = "Chrome";
}
else if(navigator.userAgent.indexOf("Safari")!=-1){
name = "Safari";
}
return name;
}
if( getBrowserName() == "Safari" ){
alert("You are using Safari");
}else{
alert("You are surfing on " + getBrowserName(name));
}
가장 간단한 답변 :
function isSafari() {
if (navigator.vendor.match(/[Aa]+pple/g).length > 0 )
return true;
return false;
}
navigator.vendor.toLowerCase().indexOf('apple') > -1
if (navigator.vendor.match(/apple/i)) { ... }
.
기록을 위해, 내가 찾은 가장 안전한 방법은 이 답변 에서 브라우저 감지 코드의 Safari 부분을 구현하는 것입니다 .
const isSafari = window['safari'] && safari.pushNotification &&
safari.pushNotification.toString() === '[object SafariRemoteNotification]';
물론 브라우저 별 문제를 처리하는 가장 좋은 방법은 가능한 경우 항상 기능 감지를 수행하는 것입니다. 그러나 위의 코드와 같은 코드를 사용하는 것은 여전히 에이전트 문자열 감지보다 낫습니다.
나는이 질문이 오래되었다는 것을 알고 있지만 어쨌든 누군가에게 도움이 될 수 있으므로 답변을 게시하려고 생각했습니다. 위의 솔루션은 일부 경우에 실패했기 때문에 iOS, 데스크톱 및 기타 플랫폼을 개별적으로 처리하는 방식으로 구현해야했습니다.
function isSafari() {
var ua = window.navigator.userAgent;
var iOS = !!ua.match(/iP(ad|od|hone)/i);
var hasSafariInUa = !!ua.match(/Safari/i);
var noOtherBrowsersInUa = !ua.match(/Chrome|CriOS|OPiOS|mercury|FxiOS|Firefox/i)
var result = false;
if(iOS) { //detecting Safari in IOS mobile browsers
var webkit = !!ua.match(/WebKit/i);
result = webkit && hasSafariInUa && noOtherBrowsersInUa
} else if(window.safari !== undefined){ //detecting Safari in Desktop Browsers
result = true;
} else { // detecting Safari in other platforms
result = hasSafariInUa && noOtherBrowsersInUa
}
return result;
}
이 독특한 "문제"는 브라우저가 Safari라는 것을 100 % 표시합니다 (믿거 나 말거나).
if (Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').descriptor === false) {
console.log('Hello Safari!');
}
이것은 쿠키 객체 디스크립터가 Safari에서 false로 설정되어 있고 다른 모든 쿠키가 true이므로 실제로 다른 프로젝트에서 두통을 유발한다는 것을 의미합니다. 행복한 코딩!
어쩌면 이것은 작동합니다 :
Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')
편집 : 더 이상 작동하지 않음
사용자 에이전트 스니핑은 정말 까다 롭고 신뢰할 수 없습니다. 위의 @qingu의 답변과 같은 iOS에서 Safari를 감지하려고 시도했지만 Safari, Chrome 및 Firefox에서 잘 작동했습니다. 그러나 Opera와 Edge를 Safari로 잘못 감지했습니다.
그래서 오늘과 같이 기능 감지 기능을 사용했습니다 serviceWorker
.iOS의 다른 브라우저에서는 지원되지 않고 Safari에서만 지원됩니다. https://jakearchibald.github.io/isserviceworkerready/에 명시된 바와 같이
해당 플랫폼에서 iOS 버전의 타사 브라우저는 지원되지 않습니다 (Safari 지원 참조).
그래서 우리는 다음과 같은 것을했습니다.
if ('serviceWorker' in navigator) {
return 'Safari';
}
else {
return 'Other Browser';
}
참고 : MacOS의 Safari에서는 테스트되지 않았습니다.