Skip to content

Instantly share code, notes, and snippets.

@xtrmstep
Last active October 16, 2020 18:23
Show Gist options
  • Save xtrmstep/fa17afb693f185bf52b192661cc96935 to your computer and use it in GitHub Desktop.
Save xtrmstep/fa17afb693f185bf52b192661cc96935 to your computer and use it in GitHub Desktop.
Detect browser using duck typing and User agent
function detectBrowserByFeatures() {
// Opera 8.0+
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Firefox 1.0+
var isFirefox = typeof InstallTrigger !== 'undefined';
// Safari 3.0+ "[object HTMLElementConstructor]"
var isSafari = /constructor/i.test(window.HTMLElement) || (function(p) {
return p.toString() === "[object SafariRemoteNotification]";
})(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));
// Internet Explorer 6-11
var isIE = /*@cc_on!@*/ false || !!document.documentMode;
// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;
// Chrome 1 - 71
var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;
var isMobile = window.orientation > -1;
var browserInfo =
(isOpera ? 'Opera' :
isFirefox ? 'Firefox' :
isSafari ? 'Safari' :
isChrome ? 'Chrome' :
isIE ? 'IE' :
isEdge ? 'Edge' :
"N/A") + " " +
(isMobile ? "Mobile" : "");
}
function isMobile() {
return /Mobi/.test(navigator.userAgent);
}
function getBrowserName() {
// Opera 8.0+
if ((window.opr && window.opr.addons)
|| window.opera
|| navigator.userAgent.indexOf(' OPR/') >= 0) {
return 'Opera';
}
// Firefox 1.0+
if (typeof InstallTrigger !== 'undefined') {
return 'Firefox';
}
// Safari 3.0+ "[object HTMLElementConstructor]"
if (/constructor/i.test(window.HTMLElement) || (function (p) {
return p.toString() === '[object SafariRemoteNotification]';
})(!window['safari'])) {
return 'Safari';
}
// Internet Explorer 6-11
if (/* @cc_on!@*/false || document.documentMode) {
return 'Internet Explorer';
}
// Edge 20+
if (!(document.documentMode) && window.StyleMedia) {
return 'Microsoft Edge';
}
// Chrome
if (window.chrome) {
return 'Chrome';
}
}
function getOSName() {
var os;
if (isMobile()) {
if (/Windows/.test(navigator.userAgent)) {
os = 'Windows';
if (/Phone 8.0/.test(navigator.userAgent)) {
os += ' Phone 8.0';
} else if (/Phone 10.0/.test(navigator.userAgent)) {
os += ' Phone 10.0';
}
} else if (/Android/.test(navigator.userAgent)) {
function androidVersion() {
if (/Android/.test(navigator.appVersion)) {
var v = (navigator.appVersion).match(/Android (\d+).(\d+)/);
return v;
}
}
var ver = androidVersion();
os = ver[0];
} else if (/iPhone;/.test(navigator.userAgent)) {
function iOSversion() {
if (/iP(hone|od|ad)/.test(navigator.appVersion)) {
var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
}
}
var ver = iOSversion();
os = 'iOS ' + ver[0] + '.' + ver[1] + '.' + ver[2];
} else if (/iPad;/.test(navigator.userAgent)) {
function iOSversion() {
if (/iP(hone|od|ad)/.test(navigator.appVersion)) {
var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
}
}
var ver = iOSversion();
os = 'iOS ' + ver[0] + '.' + ver[1] + '.' + ver[2];
} else if (/BBd*/.test(navigator.userAgent)) {
os = 'BlackBerry';
}
} else {
if (/Windows/.test(navigator.userAgent)) {
os = 'Windows';
if (/5.1;/.test(navigator.userAgent)) {
os += ' XP';
} else if (/6.0;/.test(navigator.userAgent)) {
os += ' Vista';
} else if (/6.1;/.test(navigator.userAgent)) {
os += ' 7';
} else if (/6.2/.test(navigator.userAgent)) {
os += ' 8';
} else if (/10.0;/.test(navigator.userAgent)) {
os += ' 10';
}
if (/64/.test(navigator.userAgent)) {
os += ' 64-bit';
} else {
os += ' 32-bit';
}
} else if (/Macintosh/.test(navigator.userAgent)) {
os = 'Macintosh';
if (/OS X/.test(navigator.userAgent)) {
os += ' OS X';
}
}
}
return os;
}
function getBrowser() {
return {
os: getOSName(),
browser: getBrowserName(),
language: navigator.language,
languages: navigator.languages,
user_agent: navigator.userAgent,
device: isMobile() ? 'Mobile' : 'Desktop',
referrer: document.referrer || 'N/A',
online: navigator.onLine,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
screen_resolution: screen.width + ' x ' + screen.height,
cookie_enabled: navigator.cookieEnabled,
};
}
var info = getBrowser();
console.log(info);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment