兼容

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. JavaScript 数字

    数字(Number)也称为数值或数. 数值直接量 当数字直接出现在程序中时,被称为数值直接量.在 JavaScript 程序中,直接输入的任何数字都被视为数值直接量. 示例1 数值直接量可以细分为整型 ...

  2. Java基础 -4.6

    循环嵌套 乘法口诀表 public static void main(String[] args) { for(int x =1;x<10;x++) { for(int y=1;y<=x; ...

  3. c++模板(翁恺c++公开课[34-35]学习笔记)

    为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢? 定义基类?可以实现,很多情况下可能不够简明的表达设计思想 克隆代码(写一 ...

  4. 【PAT甲级】1019 General Palindromic Number (20 分)

    题意: 输入两个正整数n和b(n<=1e9,2<=b<=1e9),分别表示数字的大小和进制大小,求在b进制下n是否是一个回文串,输出“Yes”or“No”,并将数字n在b进制下打印出 ...

  5. [原]HelloWorld

    几乎所有程序员的编程都是从写HelloWorld开始的,作为新开的Blog我还是照旧吧. 首先需要肯定的是博客园的管理员做事很高效,我是22:08申请的,结果22:32就审核通过了,理论上讲申请审核时 ...

  6. Centos7 nginx配置多虚拟主机过程

    一.前提准备 1.已经安装好了的Centos7服务器 2.ip 为192.168.1.209   [本次的配置ip] 3.确定防火墙等已经关闭 二.nignx配置文件参数详解 要配置多台虚拟主机,就需 ...

  7. FMDB数据迁移

    https://www.jianshu.com/p/736b00b3a1e1 2017.08.25 15:44* 字数 500 阅读 1474评论 0喜欢 4 公司项目中,一般都需要做数据持久化,我们 ...

  8. CF1209C Paint the Digits

    CF1209C Paint the Digits 题意:给定T组数据,每组数据第一行输入数字串长度,第二行输入数字串,用数字1和2对数字串进行涂色,被1涂色的数字子串和被2涂色的数字子串拼接成新的数字 ...

  9. java中常用的数据结构--Collection接口及其子类

    java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类. 一.集合和数组的区别 二.C ...

  10. layer open type值类型

    参考:http://layer.layui.com/api.html layer提供了5种层类型: 0:信息框,默认 1:页面层 2:iframe层 3:加载层 4:tips层