细数IE的那些坑

注:本文将不定期更新,供前端开发人员参考,一起吐槽IE,辅助解决浏览器兼容性问题。

背景:ICMS2.0(我们公司开发的智能信用卡系统)换版时,准备上线页面静态化后的版本。(将jsp画面改造成纯静态html)结果上线失败,行内环境(IE8)登录页空白,生产环境(IE9)点击登录无反应。之前在测试的时候已经挖出了不少IE的坑,没想到到了上线的时候还是倒在了IE的魔爪下。带着深恶痛绝之情,我谨以此文痛诉IE的各路罪行!与广大前端开发者共勉!

----------------------------------------------------我是分割线--------------------------------------------------------

一、IE8 <meta>标签指定字符集时加载问题

华夏行内浏览器访问静态化后的版本时,出现页面空白的现象。于是查看源代码,发现怎么都乱码了。按F12打开调试工具之后,发现网页的结构也不完整。title标签没有闭合,body里面的内容也是空的。

事后发现,原先jsp中是在<title>标签之上就通过<%@ pageEncoding="UTF-8">指定了字符集。

而静态化后通过页面的<meta>标签指定,由于写在了<title>下面,所以title的中文被解析成了乱码,导致网页的标签都乱掉了无法解析。这个问题在IE9以上版本得到了修复,浏览器不再由上往下依次解析,而是先分析<meta>标签的字符集,再解析整个网页。不过为了对付IE8这个老怪兽,还是老实点把<meta>标签放在上面吧!

二、IE8/IE9在不开启调试模式时没有console对象

公司楼下机房大多数浏览器都是IE9版本,当时代码上线后发现登录页面无法点击登录按钮。开启控制台输出的也是莫名其妙的错误,但一旦开启调试模式之后就一切正常。

在度娘的指导下,总算抓住了真凶。原来页面的主流程中使用了console.log方法,而IE8、IE9两位大哥纷纷表示不认识:“console你谁啊?”,只有你开启了调试模式(调教模式),两兄弟才求饶:“认识了认识了!”而谁会没事经常打开调教模式,所以两兄弟经常绑架用户,js解析出错,导致页面崩溃。

解决的办法就是在所有使用console函数的签名加一段条件判断语句"if(window.console&&window.console.log)"。先得礼貌一点问下IE大哥认识不?大哥才能饶你一命。

三、IE浏览器splice方法不同

我们知道js里,处理数组有个splice方法。我们先看看splice方法的定义。

arrayObject.splice(index,howmany,item1,.....,itemX)

index表示数组的起始位置,howmany表示要删除的数量,后面的item表示要增加的数组项,方法的返回值是被删除的数组。注:该方法会直接修改原数组

我们经常使用arr.splice(1)的返回值用来截掉数组的第一位。(省略了howmany,默认会设置成最大)而这个方法在IE8中的定义并不是这样。IE8中howmany默认是0,这就导致了arr.splice(1)的返回值是空。

在IE8下的结果:

在IE9以上的结果

解决办法是使用slice方法替换:

四、IE8浏览器的<scrpit>标签没有onload事件

  之前静态化改造过程中,需要动态引入js。故需要动态生成script标签的。

而我想通过script标签的onload方法执行回调函数时,发现IE8浏览器下无法生效。打开调试模式发现script标签根本没有onload方法。

度娘之后,找到了替代方法:

解决办法是通过判断script标签对象中是否存在onload方法来判断是使用onload事件处理回调还是通过onreadystatechange事件处理。

----------------------------------------------------我是分割线--------------------------------------------------------

IE浏览器是银行系统的常用浏览器,历史悠久,有着深厚的文化底蕴(仗着MS为所欲为),我们要理解它、善待它、没准它就咬你一口,咬到你痛!

时间: 2024-08-13 18:01:07

细数IE的那些坑的相关文章

细数php语法里的那些“坑”

尽管PHP的语法已经很松散,写起来很“爽”.但是对于像“我们”这种学过 Java. C#的“完全面向对象程序员”来说,PHP程序设计语言里,还是有一些的坑的.下面请让我来盘点一下. Parse error: syntax error, unexpected T_STRING, expecting T_FUNCTION in...... 错误原因:在PHP语法中,声明任何函数,函数名的前面需要 function 关键字. <?php //错误代码如下 class Test{ __construct

细数空格缩进在开发中的坑

没错,这是一篇火药文.网上流传的各种编程规范几乎青一色都是说用空格代替Tab,其理由几乎都是“这是唯一能保证在所有环境下获得一致展现的方法”. 那我想问一句,你们到底能要多少种环境要看代码??? 1.用Windows自带的记事本?那我只能说,你继续装,看你什么时候才能完成得了任务.2.连接到Linux服务器上使用VI或者VIM?我也只能说只有改服务器的配置文件的时候才会这样做吧,而且如果是配置文件比较复杂也是下载下来用Notepad++改清晰很多好伐,比如Aapche的配置文件在Notepad+

【转帖】鸿蒙发布,老兵戴辉为你细数一部华为操作系统28年史

鸿蒙发布,老兵戴辉为你细数一部华为操作系统28年史 https://www.ijiwei.com/html/news/newsdetail?source=pc&news_id=725007 爱集微·08-10 12:31·数码 来源: 上观新闻 一部华为发展史,也是一部可歌可泣的操作系统发展史. 8月9日,东莞松山湖沸腾的一天,华为消费者业务CEO余承东发布了鸿蒙操作系统,中文来自山海经,英文叫HarmonyOS,不是以前传说的OakOS. 余承东在介绍鸿蒙OS开发初衷时表示:“随着全场景智慧时

细数2014年成长

冬天的来临,让我的心很冷,不想动,不想思考,不想说话,今年剩下的一些日子,我想也就这样了,不会再有什么变化了.打开文档,开始记录今年,展望明年.记录是为了抛弃过去一切,又想未来某天还能拾起,所以把它尘封在笔记里.之后就可让脑中的一切随风消散,没有任何思想负担,放空的心就能接纳更多新的内容. 细数2014年的成长  成长主要在意识形态上,至于技术,越来越难静下心来学了. 1.彻底离弃网络游戏 放弃网络游戏,开始把人生当做游戏.这个游戏只有一次机会,不能死,不能走错路,每一次选择都要经过深思熟虑.和

细数人体器官仿生,还有哪些可开发的

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 人体器官列表(后续'借'张人体图过来 -- 读书人的事情,不能叫偷,叫窃,谐个音,就叫借了) 1.眼:摄像头: 2.耳:mic: 3.口:音箱或耳

细数AutoLayout以来UIView和UIViewController新增的相关API&lt;转写&gt;

细数AutoLayout以来UIView和UIViewController新增的相关API – UIViewController篇 UILayoutSupport @property(nonatomic,readonly,retain) id<UILayoutSupport> topLayoutGuide NS_AVAILABLE_IOS(7_0); @property(nonatomic,readonly,retain) id<UILayoutSupport> bottomLay

再回首:细数存储设备的前世今生-转

我们如何迎头赶上? 据IDC统计,今年全球数据总量将达到2.16ZB,预计将在2016年增长到3.77ZB.随着数据量的不断增长,对数据存储的要求也越来越高,不过无须担心,相关的存储技术也已经迎头赶上. 数据存储技术是发展最快的电子技术.磁带,硬盘和固态硬盘的容量大约以每12到18个月就会增加一倍. 如今的台式机硬盘容量已经高达4TB~5TB.这足以装下1万张照片或562小时的高清视频.希捷表示,到2020年热辅助磁记录技术(HAMR)会带来60TB硬盘,这一容量足以存储12万张照片或6750小

年华细数 谁的幸福不知归途

年华细数  谁的幸福不知归途 文   沫子也 他今年大一,他喜欢她. 有别于一见钟情,他对她的喜欢更趋向于百转千回,这个时候的她,刚和男朋友分手,念大二.之所以说百转千回,还因为后来一起吃饭的时候,她问他彼此是什么时候见的第一面,他支吾半天竟想不起来,第一次见面,大抵没给他留下多少印象.只是在全社大会的时候,不期然的,她就坐在了他的旁边.他注意到她的眼神,月光一样清亮.散会后,报名参加活动的表格上,他没细想星期四自己有课,就把她填的兴趣组合唱班给照搬抄了下来.慢慢的因为工作关系,他们是朋友. 如

从VGA到GPU!细数二十年显卡发展历程

VGA有很多层涵义,本来是用于代表一个分辨率(您可能不了解VGA,但应该知道QVGA代表什么),随后被普遍称为显示输出接口.为了输出VGA分辨 率.提供VGA输出接口,显卡和VGA就有了不解之缘,显卡被称为VGA Card是有历史原因的,如果您对此感兴趣的话,请慢慢看: ● 什么是VGA? VGA,Video Graphic  Array,视频图形阵列,表示一组点阵图形,长640像素宽480像素,最初能够输出640×480分辨率的接口叫做D-Sub,也被称作VGA接口, 它是一个15针的梯形插头