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);
ネガティブルックアラウンドを使用Safari
し、ユーザーエージェントに名前を含むChrome、Edge、およびすべてのAndroidブラウザーを除外します。
他の人々がすでに述べたように、特定のブラウザをチェックするよりも機能検出が優先されます。1つの理由は、ユーザーエージェント文字列が変更される可能性があることです。別の理由は、新しいバージョンでは文字列が変更されてコードが壊れる可能性があるためです。
それでもそれを実行して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/
Chromeのドキュメントに従って更新、iOSでChromeを正しく検出するようになりました
iOS上のすべてのブラウザーはSafariのラッパーにすぎず、同じエンジンを使用することに注意してください。このスレッドで彼自身の答えについてのbfred.itのコメントを参照してください。
Firefoxのドキュメントに従って更新され、iOS上のFirefoxを正しく検出します
isSafari
となりtrue
、Safariブラウザでfalse
そう。上記のスニペットを使用して、投稿したとおりに使用できます。if (isSafari) { do_this(); } else { do_that(); }
。
&& !navigator.userAgent.match('FxiOS')
、Chromeチェックと同様に追加できます-ref (developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/…)
ただ使用する:
var isSafari = window.safari !== undefined;
if (isSafari) console.log("Safari, yeah!");
getUserMedia
。
このコードはSafariブラウザのみを検出するために使用されます
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)
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 Chrome:
他のコードを試した後、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>
Safariを区別する単語は1つだけです-"バージョン"。したがって、この正規表現は完璧に機能します。
/.*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;
}
上記の回答の正規表現を変更しました
var isSafari = /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent);
このユニークな「問題」は、ブラウザがSafariであるという100%の兆候です(信じられないかもしれませんが)。
if (Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').descriptor === false) {
console.log('Hello Safari!');
}
これは、Safariではcookieオブジェクト記述子がfalseに設定されているが、他のすべてではtrueであることを意味します。これにより、実際には他のプロジェクトで頭痛の種となっています。幸せなコーディング!
多分これはうまくいきます:
Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')
編集:機能しない
ユーザーエージェントのスニッフィングは本当にトリッキーで信頼性が低くなります。上記の@qinguの回答のようなものを使用してiOSでSafariを検出しようとしましたが、Safari、Chrome、Firefoxでうまく機能しました。しかし、それはOperaとEdgeをSafariとして誤って検出しました。
そのため、今日のように機能検出が行われましたが、これserviceWorker
はSafariでのみサポートされており、iOSの他のブラウザーではサポートされていません。https://jakearchibald.github.io/isserviceworkerready/で述べられているように
サポートには、そのプラットフォーム上のサードパーティ製ブラウザーのiOSバージョンは含まれません(Safariサポートを参照)。
だから私たちは次のようなことをしました
if ('serviceWorker' in navigator) {
return 'Safari';
}
else {
return 'Other Browser';
}
注:MacOSのSafariではテストされていません。