1 /** 2 * Hilo 3 * Copyright 2015 alibaba.com 4 * Licensed under the MIT License 5 */ 6 7 /** 8 * @class Browser feature set 9 * @static 10 * @module hilo/util/browser 11 */ 12 var browser = (function(){ 13 var ua = navigator.userAgent; 14 var doc = document; 15 var win = window; 16 var docElem = doc.documentElement; 17 18 var data = /** @lends browser */ { 19 /** 20 * 是否是iphone 21 * @type {Boolean} 22 */ 23 iphone: /iphone/i.test(ua), 24 25 /** 26 * 是否是ipad 27 * @type {Boolean} 28 */ 29 ipad: /ipad/i.test(ua), 30 31 /** 32 * 是否是ipod 33 * @type {Boolean} 34 */ 35 ipod: /ipod/i.test(ua), 36 37 /** 38 * 是否是ios 39 * @type {Boolean} 40 */ 41 ios: /iphone|ipad|ipod/i.test(ua), 42 43 /** 44 * 是否是android 45 * @type {Boolean} 46 */ 47 android: /android/i.test(ua), 48 49 /** 50 * 是否是webkit 51 * @type {Boolean} 52 */ 53 webkit: /webkit/i.test(ua), 54 55 /** 56 * 是否是chrome 57 * @type {Boolean} 58 */ 59 chrome: /chrome/i.test(ua), 60 61 /** 62 * 是否是safari 63 * @type {Boolean} 64 */ 65 safari: /safari/i.test(ua), 66 67 /** 68 * 是否是firefox 69 * @type {Boolean} 70 */ 71 firefox: /firefox/i.test(ua), 72 73 /** 74 * 是否是ie 75 * @type {Boolean} 76 */ 77 ie: /msie/i.test(ua), 78 79 /** 80 * 是否是opera 81 * @type {Boolean} 82 */ 83 opera: /opera/i.test(ua), 84 /** 85 * 是否支持触碰事件。 86 * @type {String} 87 */ 88 supportTouch: 'ontouchstart' in win, 89 90 /** 91 * 是否支持canvas元素。 92 * @type {Boolean} 93 */ 94 supportCanvas: doc.createElement('canvas').getContext != null, 95 /** 96 * 是否支持本地存储localStorage。 97 * @type {Boolean} 98 */ 99 supportStorage: false, 100 101 /** 102 * 是否支持检测设备方向orientation。 103 * @type {Boolean} 104 */ 105 supportOrientation: 'orientation' in win || 'orientation' in win.screen, 106 107 /** 108 * 是否支持检测加速度devicemotion。 109 * @type {Boolean} 110 */ 111 supportDeviceMotion: 'ondevicemotion' in win 112 }; 113 114 //`localStorage` is null or `localStorage.setItem` throws error in some cases (e.g. localStorage is disabled) 115 try{ 116 var value = 'hilo'; 117 localStorage.setItem(value, value); 118 localStorage.removeItem(value); 119 data.supportStorage = true; 120 }catch(e){} 121 122 /** 123 * 浏览器厂商CSS前缀的js值。比如:webkit。 124 * @type {String} 125 */ 126 var jsVendor = data.jsVendor = data.webkit ? 'webkit' : data.firefox ? 'webkit' : data.opera ? 'o' : data.ie ? 'ms' : ''; 127 /** 128 * 浏览器厂商CSS前缀的css值。比如:-webkit-。 129 * @type {String} 130 */ 131 var cssVendor = data.cssVendor = '-' + jsVendor + '-'; 132 133 //css transform/3d feature dectection 134 var testElem = doc.createElement('div'), style = testElem.style; 135 /** 136 * 是否支持CSS Transform变换。 137 * @type {Boolean} 138 */ 139 var supportTransform = style[jsVendor + 'Transform'] != undefined; 140 141 /** 142 * 是否支持CSS Transform 3D变换。 143 * @type {Boolean} 144 */ 145 var supportTransform3D = style[jsVendor + 'Perspective'] != undefined; 146 if(supportTransform3D){ 147 testElem.id = 'test3d'; 148 style = doc.createElement('style'); 149 style.textContent = '@media ('+ cssVendor +'transform-3d){#test3d{height:3px}}'; 150 doc.head.appendChild(style); 151 152 docElem.appendChild(testElem); 153 supportTransform3D = testElem.offsetHeight == 3; 154 doc.head.removeChild(style); 155 docElem.removeChild(testElem); 156 } 157 data.supportTransform = supportTransform; 158 data.supportTransform3D = supportTransform3D; 159 160 var supportTouch = data.supportTouch; 161 162 /** 163 * 鼠标或触碰开始事件。对应touchstart或mousedown。 164 * @type {String} 165 */ 166 var POINTER_START = supportTouch ? 'touchstart' : 'mousedown'; 167 168 /** 169 * 鼠标或触碰移动事件。对应touchmove或mousemove。 170 * @type {String} 171 */ 172 var POINTER_MOVE = supportTouch ? 'touchmove' : 'mousemove'; 173 174 /** 175 * 鼠标或触碰结束事件。对应touchend或mouseup。 176 * @type {String} 177 */ 178 var POINTER_END = supportTouch ? 'touchend' : 'mouseup'; 179 180 data.POINTER_START = POINTER_START; 181 data.POINTER_MOVE = POINTER_MOVE; 182 data.POINTER_END = POINTER_END; 183 184 return data; 185 })();