尽管两者都是基于 Webkit 的浏览器,但 Safari 会对 URL 中的引号进行 urlencode,而 Chrome 则不会。
因此我需要在 JS 中区分这两者。
jQuery 的浏览器检测文档将“safari”标记为已弃用。
有没有更好的方法,还是我现在就坚持使用已弃用的值?
尽管两者都是基于 Webkit 的浏览器,但 Safari 会对 URL 中的引号进行 urlencode,而 Chrome 则不会。
因此我需要在 JS 中区分这两者。
jQuery 的浏览器检测文档将“safari”标记为已弃用。
有没有更好的方法,还是我现在就坚持使用已弃用的值?
使用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');}
以下标识 Safari 3.0+ 并将其与 Chrome 区分开来:
isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)
不幸的是,上面的例子也将 android 的默认浏览器检测为 Safari,但事实并非如此。我用了
navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && navigator.userAgent.indexOf('Android') == -1
为了检查 Safari,我使用了这个:
$.browser.safari = ($.browser.webkit && !(/chrome/.test(navigator.userAgent.toLowerCase())));
if ($.browser.safari) {
alert('this is safari');
}
它工作正常。
显然,唯一可靠且可接受的解决方案是像这样进行特征检测:
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;