123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /**
- * 浏览器兼容性,特性检查
- * 参考列表: 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 = '<div class="modal fade" id="browser" data-backdrop="static">' +
- '<div class="modal-dialog modal-lg" role="document">' +
- '<div class="modal-content">' +
- '<div class="modal-body">' +
- '<h5>浏览器版本过低,可能会有安全风险;</h5>' +
- '<h5>请更新 「浏览器」 或者 使用 「纵横Z+造价工作平台」 登录。</h5>' +
- '<div class="row my-4">' +
- '<div class="col-6">' +
- '<div class="text-center"><a href="https://www.microsoft.com/zh-cn/edge" class="btn btn-primary" target="_blank">下载 Microsoft Edge</a></div>' +
- '</div>' +
- '<div class="col-6">' +
- '<div class="text-center"><a href="https://smartcost.com.cn/downloadzplus" class="btn btn-primary" target="_blank">下载 纵横Z+造价工作平台</a></div>' +
- '</div></div></div></div></div></div>';
- $('body').append(html);
- $('#browser').modal('show');
- }
- $(document).ready(function () {
- // 浏览器兼容性
- var isCompat = checkSyntax();
- if (!isCompat) {
- $('#inputEmail').blur();
- showBrowserTip();
- return false;
- }
- });
|