      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 })();