在浏览器上开发的一些坑总结
-
console的支持情况,在ie8/9下如果不打开debug调试器,则会报错,参看console支持情况 -
input事件问题,input事件是在ie9+支持的,但是在遇到ie10/11情况下,定义了placeholder属性时,输入框聚焦或者离开焦点时都会派发input事件,以及代码去赋值placeholder也会如此,所以这种情况下,还是使用keydown事件来代替处理更好些 -
ie下ajax的get请求会被缓存返回304,打开调试器就不会,处理方式:1. 请求地址追加时间戳 2. 服务端设置Response Body消息头Cache-Control:max-age=0 -
ie下容器里包含一个disabled元素,这个元素还是能触发click事件,示例查看 http://output.jsbin.com/hukozi/13 -
ie9/10下有时元素的clientHeight为0,原因 http://www.satzansatz.de/cssd/onhavinglayout.html -
ie8/9跨域Ajax问题限制,因为在ie8/9使用XDomainRequest而不是XMLHttpRequest,导致一些限制 Detail- 只能是
GET/POST POST请求时,传输数据Content-type必须是text/plain- 只能是
HTTP/HTTPS - 协议调用必须相同
- 只能是异步
- 只能是
-
当元素高度为
0时,它父元素的scrollWidth在不同浏览器值不一样,示例查看 https://stackoverflow.com/questions/45809092/element-scrollwidth-value-different-in-ie-chrome-firefox -
`JavaScript` 处理数字问题
问题场景前端页面通过
ajax请求获取序列值,服务端返回的是Long型数值20171024005229743,这时前端获取转化成Number时就变成20171024005229744示例
+'20171024005229743' //output 20171024005229744
JavaScript里的Number是采用双精度浮点型 (IEEE-754 double-precision floating-point format numbers)它有一个安全整数范围
-(2^53 - 1) ~ (2^53 - 1)即± 9007199254740991,当超过这个范围后就不安全了示例
9007199254740993 === 9007199254740992 // output true
在
ECMAScript 2015提供了Number.MAX_SAFE_INTEGER/MIN_SAFE_INTEGER/isSafeInteger()来进行安全整形判断在
Java里,Integer整形范围-(2^31 - 1) ~ 2^31 - 1,Long长整型范围-(2^63 - 1) ~ 2^63 - 1因此服务端对应如果要做
JSON对象传递前台时,长整型需要转成字符串返回 -
`IE8` 下事件对象不会传递到 `setTimeout` 函数里
示例
$('button').on('click', function(e) { setTimeout(function() { // 这里 e.originalEvent 获取是空对象,访问里面属性报错 Member not found. console.log(e.originalEvent); }, 100); })
这个时候在
IE8下要做对象深拷贝处理$('button').on('click', function(e) { + var copyE = $.extend(true, {}, e); setTimeout(function() { console.log(copyE.originalEvent); }, 100); }) -
IE8/9下引用样式文件问题,示例查看 https://github.com/makandra/ie-css-testCSS选择器限制,在IE8/9下当选择器条目超过 4095 时,后面的样式选择器不再生效CSS文件限制,在IE8/9下当引入的CSS文件大于 31 时,后面引入的样式文件不在生效