兼容和Error

兼容

IE兼容

  • ie没有forEach
if(!Array.prototype.forEach) {
    Array.prototype.forEach = function(fun){
        var len = this.length;
        if(typeof fun != "function"){
            throw new TypeError();
        }
        var thisp = arguments[1];
        for(var i = 0; i < len; i++){
            if (i in this){
                fun.call(thisp, this[i], i, this);
            }
        }
    }
}  
  • ie没有trim
String.prototype.trim=function(){
    return this.replace(/(^\s*)|(\s*$)/g,"");
}  
  • ie没有json
if (!window.JSON) {
    // 添加json对象
    window.JSON = {
        parse: function(jsonStr) {
            console.log(123)
            return eval('(' + jsonStr + ')');
        },
        stringify: function(jsonObj) {
            var result = '',curVal;
            if (jsonObj === null) {
                return String(jsonObj);
            }
            switch (typeof jsonObj) {
                case 'number':
                case 'boolean':
                    return String(jsonObj);
                case 'string':
                    return '"' + jsonObj + '"';
                case 'undefined':
                case 'function':
                    return undefined;
            }
            switch (Object.prototype.toString.call(jsonObj)) {
                case '[object Array]':
                    result += '[';
                    for (var i = 0, len = jsonObj.length; i < len; i++) {
                        curVal = JSON.stringify(jsonObj[i]);
                        result += (curVal === undefined ? null : curVal) + ",";
                    }
                    if (result !== '[') {
                        result = result.slice(0, -1);
                    }
                    result += ']';
                    return result;
                case '[object Date]':
                    return '"' + (jsonObj.toJSON ? jsonObj.toJSON() : jsonObj.toString()) + '"';
                case '[object RegExp]':
                    return "{}";
                case '[object Object]':
                    result += '{';
                    for (i in jsonObj) {
                        if (jsonObj.hasOwnProperty(i)) {
                            curVal = JSON.stringify(jsonObj[i]);
                            if (curVal !== undefined) {
                                result += '"' + i + '":' +curVal + ',';
                            }
                        }
                    }
                    if (result !== '{') {
                        result = result.slice(0, -1);
                    }
                    result += '}';
                    return result;

                case '[object String]':
                    return '"' + jsonObj.toString() + '"';
                case '[object Number]':
                case '[object Boolean]':
                    return jsonObj.toString();
            }
        }
    };
}  
  • ie没有xhr(jq做了兼容)
  • ie没有addEventListener(jq做了兼容)
  • ie没有event.stopPropagation(改成e.cancelBubble=true)
  • ie没有event.preventDefault(改成window.event.returnValue = false;//注意加window)
  • ie没有console.log(改成alert)

苹果手机

  • 苹果手机日期转时间不支持"xxxx-xx-xx",只能用"xxxx/xx/xx"
  • 苹果手机键盘回弹页面不回弹
document.body.addEventListener('click',function (e) {
   if(e.target.type == "text" || e.target.type == "password" || e.target.tagName == "TEXTAREA" ){
    var nowTop = document.documentElement.scrollTop || document.body.scrollTop || 0;
    e.target.addEventListener('blur',mimeBlur)
    function mimeBlur() {
        var e = event || window.event;
        e.target.removeEventListener('blur',mimeBlur)
        setTimeout(function() {
        window.scrollTo(0,nowTop);
        }, 100);
    }
   }
})
  • 苹果的画布内容大小不能大于3m (这个无解)
  • 移动端input只读属性在iOS上点击还是有光标
<input type="text" unselectable="on" οnfοcus="this.blur();" readonly />
// unselectable属性作用
// 在IE浏览器中,当input获得焦点时,点击有unselectable=”on”属性的标签时,不会触发onblur事件。
// onfocus=”this.blur()”方法作用
// 获取焦点时调用失去焦点事件

安卓手机

  • 安卓手机的微信分享API不能用1.4api(继续用即将废弃的写法)
  • 安卓需要去除300毫秒的双击延迟(用faskclick.js)

微信浏览器

  • 手机端和微信端添加了autoplay以后还是不可以自动播放,这是因为手机端为了节约流量所设置的
//这也不行就得用接口签名之后再ready里执行play了
document.addEventListener("WeixinJSBridgeReady", function () {
     audio.play();
}, false);
  • 微信的reload刷新地址无效
// location.reload()无效
location.href = location.href  + '_t=' + new Date().getTime()

上面的是开发过程中遇到的,其他文章有
浏览器兼容性问题解决方案
移动开发兼容问题整理笔记
移动开发软键盘兼容

错误捕获

文章来自
错误拦截插件,付费

常见错误

  • JS 语法错误、代码异常
  • AJAX 请求异常
  • 静态资源加载异常
  • Promise 异常
  • Iframe 异常
  • 跨域 Script error
  • 崩溃和卡顿

错误捕获方式

  • 可疑区域增加 Try-Catch,try-catch 只能捕获到同步的运行时错误,对语法和异步错误却无能为力,捕获不到
  • 全局监控 JS 异常 window.onerror,onerror最好写在所有 JS 脚本的前面,否则有可能捕获不到错误
/**
* @param {String}  message    错误信息
* @param {String}  source    出错文件
* @param {Number}  lineno    行号
* @param {Number}  colno    列号
* @param {Object}  error  Error对象(对象)
*/
window.onerror = function(message, source, lineno, colno, error) {
   console.log('捕获到异常:',{message, source, lineno, colno, error});
}
  • 全局监控静态资源异常 window.addEventListener
window.addEventListener('error', (error) => {
    console.log('捕获到异常:', error);
}, true)
  • 捕获没有 Catch 的 Promise 异常:unhandledrejection
window.addEventListener("unhandledrejection", function(e){
  e.preventDefault()
  console.log('捕获到异常:', e);
  return true;
});
  • VUE errorHandler 和 React componentDidCatch
Vue.config.errorHandler = (err, vm, info) => {
  console.error('通过vue errorHandler捕获的错误');
  console.error(err);
  console.error(vm);
  console.error(info);
}
  • 监控网页崩溃:window 对象的 load 和 beforeunload
  • 跨域 crossOrigin 解决

原文地址:https://www.cnblogs.com/pengdt/p/12072487.html

时间: 2024-11-04 20:01:55

兼容和Error的相关文章

C++程序windows To linux移植经验案例

软件项目在实际部署的时候,当客户环境要求linux系统时,不可避免的需要将windows版本移植到linux系统中.下面来介绍linux系统下软件开发的基础及所遇到的问题. 1.Linux环境简介 Linux版本号:num.num.num 其中第一个数字是主版本号,第二个数字是次版本号,第三个数字是修订版本号.如果次版本号是偶数,那么该内核就是稳定版的;若是奇数,则是开发版的.头两个数字合在一齐可以描述内核系列.如稳定版的2.6.4,它是2.6版内核系列. 1.2    Linux下应用软件 语

SMBus PEC

SMBus一种I2C总线的变种 SMBus 提供了PEC方式,提高了传输的可靠性. 总线的发展都是在提高速度,提高可靠性或者提高传输效率上下功夫. PEC不具备纠错的能力,是在I2C link layer增加了一种手段来有效的检验传输的数据是否有错. PEC : Packet Error Code (CRC-8 error checking) 6.4 Packet Error Checking The Packet Error Checking mechanism improves reliab

Gradle &#39;MYasprj&#39; project refresh failed Error:CreateProcess error=216, 该版本的 %1 与您运行的 Windows 版本不兼容

Gradle ‘MYasprj’ project refresh failed Error:CreateProcess error=216, 该版本的 %1 与您运行的 Windows 版本不兼容.请查看计算机的系统信息,了解是否需要 x86 (32 位)或 x64 (64 位)版本的程序,然后联系软件发布者. 解决方案: 你开发项目的引用Javajdk,与本机安装的Java jdk版本不一致,打开项目后,在project structure里面更改一下本机的真实的java jdk路径.  Gr

Error:&quot;_TCHAR**&quot;的实参与&quot;char**&quot;的形参不兼容

使用VS2010编写自己的第一个openGL代码遇到了这样的问题 #include "stdafx.h" #include "glut.h" int _tmain(int argc, _TCHAR* argv[]) { glutInit(&argc,argv);//Error:"_TCHAR**"的实参与"char**"的形参不兼容 return 0; } 在网上搜索了一些解决方法,自己总结如下: char是C语言标准

MFC中字符串赋值出现“Error:“const char*”类型的实参与“LPCWSTR”类型的形参不兼容”错误的解决方法

在编译MFC工程时,写下面代码出现了“Error:“const char*”类型的实参与“LPCWSTR”类型的形参不兼容”的错误. TextOut(hdc,0,0,"Mercedes",strlen("Mercedes")); 这是由于工程采用Unicode编码,这时“Mercedes”字符串类型为“wchar_t*”, 这时应该这样赋值: TextOut(hdc,0,0,_T("Mercedes"),strlen("Mercedes

[Unity] Shader Graph Error 当前渲染管道与此主节点不兼容(The current render pipeline is not compatible with this master node)

Shader Graph Error  : The current render pipeline is not compatible with this master node 问题产生环境: Unity 2019.2.15f1 HDRP 6.9.2 报错和截图如上, 说是 当前渲染管道与此主节点不兼容, 解决方法: 1: 在 Assets 资源管理器中新建一个文件夹, 例如上图中我是在 _Shaders 文件夹下新建了一个名为 HDRP 的文件夹 2: 选中刚刚新建的文件夹, 点击鼠标右键创

Android 高斯模糊 renderscript 兼容4.0以下报错android.support.v8.renderscript.RSRuntimeException: Error loadin

导入官方jar   renderscript-v8.jar  报这个错误 android.support.v8.renderscript.RSRuntimeException: Error loadin 或者 java.lang.UnsatisfiedLinkError: Couldn't load RSSupport from loader dalvik.system.PathClassLoader 这个错误 原因是因为在4.4以上的手机上自带 librsjni.so和libRSSupport

Error:不能将&quot;char*&quot;类型的值分配到&quot;LPSTR&quot;类型的实体 或者 &quot;char*&quot;类型的实参与&quot;LPCWSTR&quot;类型的形参不兼容

选择"XXX项目"->"属性"->"配置属性"->"常规"选项中,把"使用 Unicode 字符集"改为"使用多字节字符集",然后确定.如下图(VS2012):

Error:不能将&quot;char*&quot;类型的值分配到&quot;LPSTR&quot;类型的实体 也许 &quot;char*&quot;类型的实参与&quot;LPCWSTR&quot;类型的形参不兼容

http://www.myexception.cn/ruby-rails/1876106.html 选择“XXX项目”->“属性”->“配置属性”->“常规”选项中,把“使用 Unicode 字符集”改为“使用多字节字符集”,然后确定.如下图(VS2012):