The source code

    /**
     * @ignore
     * detect if current browser supports various features.
     * @author yiminghe@gmail.com
     */
    (function (S) {

        var Env = S.Env,
            win = Env.host,
            UA = S.UA,
        // nodejs
            doc = win.document || {},
        // phantomjs issue: http://code.google.com/p/phantomjs/issues/detail?id=375
            isTouchSupported = ('ontouchstart' in doc) && !(UA.phantomjs),
            documentMode = doc.documentMode,
            ie = documentMode || UA.ie,
            isNativeJSONSupported = ((Env.nodejs && typeof global === 'object') ? global : win).JSON;

        // ie 8.0.7600.16315@win7 json bug!
        if (documentMode && documentMode < 9) {
            isNativeJSONSupported = 0;
        }

        /**
         * test browser features
         * @class KISSY.Features
         * @private
         * @singleton
         */
        S.Features = {
            // http://blogs.msdn.com/b/ie/archive/2011/09/20/touch-input-for-ie10-and-metro-style-apps.aspx
            /**
             * @ignore
             * whether support win8 pointer event.
             * @type {Boolean}
             */
            // isMsPointerEnabled: "msPointerEnabled" in (win.navigator || {}),
            /**
             * whether support touch event.
             * @method
             * @return {Boolean}
             */
            isTouchSupported: function () {
                return isTouchSupported;
            },

            isDeviceMotionSupported: function () {
                return !!win['DeviceMotionEvent'];
            },

            'isHashChangeSupported': function () {
                // ie8 支持 hashchange
                // 但 ie8 以上切换浏览器模式到 ie7（兼容模式），
                // 会导致 'onhashchange' in window === true，但是不触发事件
                return ( 'onhashchange' in win) && (!ie || ie > 7);
            },

            /**
             * whether support native json
             * @method
             * @return {Boolean}
             */
            isNativeJSONSupported: function () {
                return isNativeJSONSupported;
            }
        };

    })(KISSY);