Last active
December 19, 2015 05:29
-
-
Save jbottigliero/5904613 to your computer and use it in GitHub Desktop.
AMD wrapper of Zepto's 'detect' module for jQuery
This file contains 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 (root, doc, factory) { | |
if (typeof define === 'function' && define.amd) { | |
define(['global/jquery'], function( $ ) { | |
factory( $, root, doc); | |
return $; | |
}); | |
} else { | |
factory( root.jQuery, root, doc); | |
} | |
})( this, document, function( jQuery, window, document){ | |
// Zepto's detect module: | |
// https://github.com/madrobby/zepto/blob/master/src/detect.js#files | |
// Zepto.js | |
// (c) 2010-2014 Thomas Fuchs | |
// Zepto.js may be freely distributed under the MIT license. | |
(function($){ | |
function detect(ua){ | |
var os = this.os = {}, browser = this.browser = {}, | |
webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/), | |
android = ua.match(/(Android);?[\s\/]+([\d.]+)?/), | |
osx = !!ua.match(/\(Macintosh\; Intel /), | |
ipad = ua.match(/(iPad).*OS\s([\d_]+)/), | |
ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/), | |
iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/), | |
webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/), | |
wp = ua.match(/Windows Phone ([\d.]+)/), | |
touchpad = webos && ua.match(/TouchPad/), | |
kindle = ua.match(/Kindle\/([\d.]+)/), | |
silk = ua.match(/Silk\/([\d._]+)/), | |
blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/), | |
bb10 = ua.match(/(BB10).*Version\/([\d.]+)/), | |
rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/), | |
playbook = ua.match(/PlayBook/), | |
chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/), | |
firefox = ua.match(/Firefox\/([\d.]+)/), | |
ie = ua.match(/MSIE\s([\d.]+)/) || ua.match(/Trident\/[\d](?=[^\?]+).*rv:([0-9.].)/), | |
webview = !chrome && ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/), | |
safari = webview || ua.match(/Version\/([\d.]+)([^S](Safari)|[^M]*(Mobile)[^S]*(Safari))/) | |
// Todo: clean this up with a better OS/browser seperation: | |
// - discern (more) between multiple browsers on android | |
// - decide if kindle fire in silk mode is android or not | |
// - Firefox on Android doesn't specify the Android version | |
// - possibly devide in os, device and browser hashes | |
if (browser.webkit = !!webkit) browser.version = webkit[1] | |
if (android) os.android = true, os.version = android[2] | |
if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.') | |
if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.') | |
if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null | |
if (wp) os.wp = true, os.version = wp[1] | |
if (webos) os.webos = true, os.version = webos[2] | |
if (touchpad) os.touchpad = true | |
if (blackberry) os.blackberry = true, os.version = blackberry[2] | |
if (bb10) os.bb10 = true, os.version = bb10[2] | |
if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2] | |
if (playbook) browser.playbook = true | |
if (kindle) os.kindle = true, os.version = kindle[1] | |
if (silk) browser.silk = true, browser.version = silk[1] | |
if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true | |
if (chrome) browser.chrome = true, browser.version = chrome[1] | |
if (firefox) browser.firefox = true, browser.version = firefox[1] | |
if (ie) browser.ie = true, browser.version = ie[1] | |
if (safari && (osx || os.ios)) {browser.safari = true; if (osx) browser.version = safari[1]} | |
if (webview) browser.webview = true | |
os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || | |
(firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))) | |
os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || blackberry || bb10 || | |
(chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || | |
(firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))) | |
} | |
detect.call($, navigator.userAgent) | |
// make available to unit tests | |
$.__detect = detect | |
})(jQuery); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment