mirror of
https://gitee.com/ant-design-vue/ant-design-vue.git
synced 2024-12-15 01:11:53 +08:00
9e0df41a55
* chore: remove resize-observer-polyfill * refactor: align * refactor(v3/avatar): refactor using composition api (#4052) * refactor(avatar): refactor using composition api * refactor: update props define * fix: avatar src scale not update * refactor: resizeObserver * refactor: divider * refactor: localeProvider * refactor(v3/back-top): use composition api (#4060) * refactor: backtop * refactor: empty * refactor: transButton * feat(v3/avatar): add avatar group (#4062) * feat(avatar): add avatar group * refactor: update * refactor: update Co-authored-by: tangjinzhou <415800467@qq.com> * refactor: avatar * refactor: avatar * style: rename useProvide * refactor: menu (#4110) * fix: menu * refactor: menu * refactor: remove rc-menu * fix: menu rtl error * style: lint * refactor(Anchor): use composition api (#4054) * refactor: anchor * refactor: anchor * refactor: anchor * feat: update * fix: icon class lose * refactor(v3/badge): use composition api (#4076) * refactor: badge * fix: badge inheritAttrs * refactor: grid * refactor: layout * fix: menu not close * refactor: space * refactor: result * refactor: affix * refactor: comment * refactor: form * feat: spin add rtl * feat: export spin type * refactor: pageHeader * refactor: page-header * refactor: skeleton * refactor: typography * refactor(v3/rate): use composition api * fix: add useRef hook * refactor: form * fix: menu not update * refactor: form * refactor: form * fix: slide animate not work * fix: menu mode error * fix: menu icon * refactor: rate * perf: remove rate * feat: add vc-overflow * refactor: menu * fix: remove flex check (#4165) * fix: dist locale file lose #3684 * release 2.2.0-beta.1 * dcos: update changelog * chore: update type * docs: update changelog Co-authored-by: John <John60676@qq.com> Co-authored-by: 言肆 <18x@loacg.com> Co-authored-by: zkwolf <chenhao5866@gmail.com>
111 lines
3.6 KiB
JavaScript
111 lines
3.6 KiB
JavaScript
// MIT License from https://github.com/kaimallea/isMobile
|
|
|
|
const applePhone = /iPhone/i;
|
|
const appleIpod = /iPod/i;
|
|
const appleTablet = /iPad/i;
|
|
const androidPhone = /\bAndroid(?:.+)Mobile\b/i; // Match 'Android' AND 'Mobile'
|
|
const androidTablet = /Android/i;
|
|
const amazonPhone = /\bAndroid(?:.+)SD4930UR\b/i;
|
|
const amazonTablet = /\bAndroid(?:.+)(?:KF[A-Z]{2,4})\b/i;
|
|
const windowsPhone = /Windows Phone/i;
|
|
const windowsTablet = /\bWindows(?:.+)ARM\b/i; // Match 'Windows' AND 'ARM'
|
|
const otherBlackberry = /BlackBerry/i;
|
|
const otherBlackberry10 = /BB10/i;
|
|
const otherOpera = /Opera Mini/i;
|
|
const otherChrome = /\b(CriOS|Chrome)(?:.+)Mobile/i;
|
|
const otherFirefox = /Mobile(?:.+)Firefox\b/i; // Match 'Mobile' AND 'Firefox'
|
|
|
|
function match(regex, userAgent) {
|
|
return regex.test(userAgent);
|
|
}
|
|
|
|
function isMobile(userAgent) {
|
|
let ua = userAgent || (typeof navigator !== 'undefined' ? navigator.userAgent : '');
|
|
|
|
// Facebook mobile app's integrated browser adds a bunch of strings that
|
|
// match everything. Strip it out if it exists.
|
|
let tmp = ua.split('[FBAN');
|
|
if (typeof tmp[1] !== 'undefined') {
|
|
[ua] = tmp;
|
|
}
|
|
|
|
// Twitter mobile app's integrated browser on iPad adds a "Twitter for
|
|
// iPhone" string. Same probably happens on other tablet platforms.
|
|
// This will confuse detection so strip it out if it exists.
|
|
tmp = ua.split('Twitter');
|
|
if (typeof tmp[1] !== 'undefined') {
|
|
[ua] = tmp;
|
|
}
|
|
|
|
const result = {
|
|
apple: {
|
|
phone: match(applePhone, ua) && !match(windowsPhone, ua),
|
|
ipod: match(appleIpod, ua),
|
|
tablet: !match(applePhone, ua) && match(appleTablet, ua) && !match(windowsPhone, ua),
|
|
device:
|
|
(match(applePhone, ua) || match(appleIpod, ua) || match(appleTablet, ua)) &&
|
|
!match(windowsPhone, ua),
|
|
},
|
|
amazon: {
|
|
phone: match(amazonPhone, ua),
|
|
tablet: !match(amazonPhone, ua) && match(amazonTablet, ua),
|
|
device: match(amazonPhone, ua) || match(amazonTablet, ua),
|
|
},
|
|
android: {
|
|
phone:
|
|
(!match(windowsPhone, ua) && match(amazonPhone, ua)) ||
|
|
(!match(windowsPhone, ua) && match(androidPhone, ua)),
|
|
tablet:
|
|
!match(windowsPhone, ua) &&
|
|
!match(amazonPhone, ua) &&
|
|
!match(androidPhone, ua) &&
|
|
(match(amazonTablet, ua) || match(androidTablet, ua)),
|
|
device:
|
|
(!match(windowsPhone, ua) &&
|
|
(match(amazonPhone, ua) ||
|
|
match(amazonTablet, ua) ||
|
|
match(androidPhone, ua) ||
|
|
match(androidTablet, ua))) ||
|
|
match(/\bokhttp\b/i, ua),
|
|
},
|
|
windows: {
|
|
phone: match(windowsPhone, ua),
|
|
tablet: match(windowsTablet, ua),
|
|
device: match(windowsPhone, ua) || match(windowsTablet, ua),
|
|
},
|
|
other: {
|
|
blackberry: match(otherBlackberry, ua),
|
|
blackberry10: match(otherBlackberry10, ua),
|
|
opera: match(otherOpera, ua),
|
|
firefox: match(otherFirefox, ua),
|
|
chrome: match(otherChrome, ua),
|
|
device:
|
|
match(otherBlackberry, ua) ||
|
|
match(otherBlackberry10, ua) ||
|
|
match(otherOpera, ua) ||
|
|
match(otherFirefox, ua) ||
|
|
match(otherChrome, ua),
|
|
},
|
|
|
|
// Additional
|
|
any: null,
|
|
phone: null,
|
|
tablet: null,
|
|
};
|
|
result.any =
|
|
result.apple.device || result.android.device || result.windows.device || result.other.device;
|
|
|
|
// excludes 'other' devices and ipods, targeting touchscreen phones
|
|
result.phone = result.apple.phone || result.android.phone || result.windows.phone;
|
|
result.tablet = result.apple.tablet || result.android.tablet || result.windows.tablet;
|
|
|
|
return result;
|
|
}
|
|
|
|
const defaultResult = {
|
|
...isMobile(),
|
|
isMobile,
|
|
};
|
|
|
|
export default defaultResult;
|