/** * 浏览器兼容性,特性检查 * 参考列表: http://kangax.github.io/compat-table/es6/ * 同内核的不同的浏览器需要处理,比如qq浏览器登陆成功后,ie浏览器登陆页面会自动跳转到项目管理页面。因此项目管理页面也需要检测 */ function checkSyntax() { 'use strict'; try { // 一些在词法、语法分析阶段就会报错的代码,必须要用window.Function或者eval包裹,否则直接报错且无法被捕获 // 不使用eval的原因:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval if (typeof window.Function === 'undefined') { return false; } // 声明 Function('let a = 1;')(); Function('const b = 1;')(); Function('class A {}')(); // 模板字符串 Function('var a = 1; var str = `${a}`;')(); // 对象简单表示 Function("var foo = 'foo'; var simple = { foo, t() {} };")(); // 对象属性表示 Function("var attr = 'a'; var obj = {[attr]: 1}")(); // 对象super Function('var proto = { p: 1 }; var obj = { superF() { return super.p } }; Object.setPrototypeOf(obj, proto)')(); // 对象getter setter Function('var tObj = { get a() {}, set a(v) {} }')(); // 扩展运算符 Function('var obj = { foo: 1 }; var obj1 = { ...obj }; var arr = [1]; var arr1 = [...arr];')(); // 解构 Function('var obj = { foo: 1 }; var { foo } = obj; var arr = [1]; var [one] = arr;')(); // 可选链 ?. es2020 //Function('var obj = { a: { b: 1 } }; obj?.a?.b')(); // of迭代 Function('for (var i of [1]) {}')(); // 默认参数 Function('function defaultParams(a = 1) {}')(); // rest参数 Function('function restParams(...args) {}')(); // arrow function Function('var arrowF = () => {};')(); // generator function Function('function* gen() {}')(); // async function es2017 Function('async function tAsync() {}')(); // Symbol Promise Set Map Proxy Reflect if (typeof Symbol === 'undefined' || typeof Promise === 'undefined' || typeof Set === 'undefined' || typeof Map === 'undefined' || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { return false; } // buffer相关 if (typeof ArrayBuffer === 'undefined' || typeof Uint8Array === 'undefined' || typeof DataView === 'undefined') { return false; } // 部分字符串方法 var stringPrototypeFuncs = [ 'includes', 'codePointAt', 'normalize', 'repeat', //'matchAll', es2020 'padStart', 'padEnd', //'trimStart', es2019 //'trimEnd' ]; var stringStaticFuncs = [ 'fromCodePoint', 'raw' ]; for (var i = 0; i < stringPrototypeFuncs.length; i++) { var f = stringPrototypeFuncs[i]; if (!String.prototype[f]) { throw new SyntaxError('String.prototype ' + f); } } for (var i = 0; i < stringStaticFuncs.length; i++) { var f = stringStaticFuncs[i]; if (!String[f]) { throw new SyntaxError('String ' + f); } } // 部分数组方法 var arrayPrototypeFuncs = [ 'find', 'findIndex', 'fill', 'keys', 'values', 'entries', //'flat', // es2019 //'flatMap', 'includes' ]; var arrayStaticFuncs = [ 'from', 'of' ]; for (var i = 0; i < arrayPrototypeFuncs.length; i++) { var f = arrayPrototypeFuncs[i]; if (!Array.prototype[f]) { throw new SyntaxError('Array.prototyp ' + f); } } for (var i = 0; i < arrayStaticFuncs.length; i++) { var f = arrayStaticFuncs[i]; if (!Array[f]) { throw new SyntaxError('Array ' + f); } } // 对象部分方法 var objectStaticFuncs = [ 'is', 'assign', 'getOwnPropertyDescriptors', 'setPrototypeOf', 'values', 'entries', //'fromEntries' // es2020 ]; for (var i = 0; i < objectStaticFuncs.length; i++) { var f = objectStaticFuncs[i]; if (!Object[f]) { throw new SyntaxError('Object ' + f); } } // DOM if (typeof document.documentElement.requestFullscreen !== 'function') { throw new TypeError('document.documentElement.requestFullscreen is not a function'); } } catch (err) { console.log(err); return false; } return true; } function showBrowserTip() { var html = '