Last active
October 16, 2020 18:23
-
-
Save xtrmstep/fa17afb693f185bf52b192661cc96935 to your computer and use it in GitHub Desktop.
Detect browser using duck typing and User agent
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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