兼容

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 解决

兼容和Error的更多相关文章

  1. Springdata mongodb 版本兼容 引起 Error [The 'cursor' option is required, except for aggregate with the explain argument

    在Spring data mongodb 中使用聚合抛出异常 mongodb版本 为 3.6 org.springframework.dao.InvalidDataAccessApiUsageExce ...

  2. mysql不同版本和存储引擎选型的验证

    Mysql的版本和存储引擎较多,为了选择最适合业务使用的系统,需要进行一定的验证,本文描述mysql的验证过程和思路. 主要涉及: Mysql的版本 v Mariadb v Tokudb v Orac ...

  3. Win10下Genymotion无法正常使用的解决方法

    原Win7下安装配置的genymotion正常使用,Eclipse的Genymotion插件也可以正常运行.系统升级后,忽然就不work了. 折腾了一天试了各种方式,网上的例子也五花八门.最后还是找到 ...

  4. 网络请求及各类错误代码含义总结(包含AFN错误码大全)

    碰见一个很奇葩的问题, 某些手机在设置了不知什么后, 某些 APP 死活 HTTPS 请求失败, 例如以 UMeng 统计HTTP 请求失败为例, Log如下: UMLOG: (Error   App ...

  5. MGR Switch Muti-Primary to single_primary

    MGR Muti-Primary 切换 single_primary 模式 原因:因为希望做ProxySQL+MGR之间Proxy层的消耗测试,需要把原有的MGR多主改为单主模式. 修改MGRgrou ...

  6. iOS之网络请求及各类错误代码含义总结(包含AFN错误码大全)

    转自http://blog.csdn.net/wangyanchang21/article/details/50932191 在很多时候都会遇到错误, 还会带有一些 Error Code , 比如在各 ...

  7. AFN errorCode对应的状态码

    转 http://blog.csdn.NET/wangyanchang21/article/details/50932191 在很多时候都会遇到错误, 还会带有一些 Error Code , 比如在各 ...

  8. 小程序 请求Promise简单封装

    最近做小程序在调用后台接口的时候感觉总写很长一串,很冗杂.非常想念vue中promise封装的写法,于是自己初步封装了一下. 1.url 接口地址 2.headers请求头 3. params 请求参 ...

  9. SMBus PEC

    SMBus一种I2C总线的变种 SMBus 提供了PEC方式,提高了传输的可靠性. 总线的发展都是在提高速度,提高可靠性或者提高传输效率上下功夫. PEC不具备纠错的能力,是在I2C link lay ...

随机推荐

  1. spring boot 是如何启动 tomcat

    Spring boot 的启动类启动后,tomcat 容器.Spring mvc .spring 事务等等第三方依赖也已经自动启动,那么spring boot 是如何启动的第三方依赖? 以spring ...

  2. 学习笔记(15)- 保险行业的问答语料 insuranceqa_data

    数据概览 ''' pool data are translated Chinese data with Google API from original English data ''' POOL_T ...

  3. Linux系统下安装python3.7.3环境

    这里用到的Linux系统是centos7系统,centos7是自带py的但是py的2.7.5版本 连接服务器的使用的是SSH Secure shell 1.首先安装依赖包 1)安装gcc编译器 gcc ...

  4. AngularJS四大特征

    AngularJS四大特征 1.MVC模式 Angular遵循软件工程的MVC模式,并鼓励展现,数据,和逻辑组件之间的松耦合.通过依赖注入(dependency injection),Angular为 ...

  5. Keepalived+Nginx解决方案实现高可用的API网关(nginx)

    一. 采用Keepalived+Nginx解决方案实现高可用的API网关. 2.1 Nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP ...

  6. Django 学习之中间件Middleware

    一.中间件介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...

  7. 134、Java中的构造方法和构造块

    01.代码如下: package TIANPAN; class Book { public Book() { // 构造方法 System.out.println("[A]Book类的构造方 ...

  8. 【剑指Offer面试编程题】题目1367:二叉搜索树的后序遍历序列--九度OJ

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...

  9. ubuntu 用管理员身份进入系统

    我们需要以管理员的身份进入系统,才能在系统中畅通无阻     以管理员的身份进入系统,往下看: Ubuntu安装好后,root初始密码(默认密码)不知道,需要设置. 1.先用安装Ubuntu的时候创建 ...

  10. 新闻网大数据实时分析可视化系统项目——9、Flume+HBase+Kafka集成与开发

    1.下载Flume源码并导入Idea开发工具 1)将apache-flume-1.7.0-src.tar.gz源码下载到本地解压 2)通过idea导入flume源码 打开idea开发工具,选择File ...