IE之不完全罪状(持续更新)

大城市里の小女人 提交于 2019-12-24 22:37:25

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

开始之前先说点题外话。 如国内浏览器特别多,而且都是包壳。这些浏览器一般来讲为了保证浏览器兼容性都会默认使用webkit内核进行渲染,再特殊情况使用ie内核。   用过一些这样的浏览器都知道它是由急速模式和兼容模式,这就是在切换模式。如果你的项目中必须要使用webkit  或者ie10 etc内核渲染,那么可以加meta标签告诉浏览器,强制浏览器选择合适的渲染模式。看起来是这样的:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

一 JS

1. XMLHttpRequest

IE8的   XMLHttpRequest的对象大概是这样的

谷歌是这样的

他们其实有一定的差别的。  比如你使用了 xhr.response  。  毫无疑问就会报错 。 IE10+ 追加了这个属性

2.console

大家知道ie 10+ 是有console的。  对于之前的版本是没有console的。 要想使用大概要这样子:

  <!--[if lt IE 10]>
    <script src="https://as.alipayobjects.com/g/component/??console-polyfill/0.2.2/index.js,es5-shim/4.5.7/es5-shim.min.js,es5-shim/4.5.7/es5-sham.min.js,html5shiv/3.7.2/html5shiv.min.js,media-match/2.0.2/media.match.min.js"></script>
    <![endif]-->

这个是阿里的console-polyfill 。

3. socket

ie8 不支持 socket 。

4. 键盘监听

比如要实现监听回车然后提交

代码大概是这样的:

那么不出所料。  ie8会报错 。只要这样就可以了。(不过ie就没有此功能了,^_^谁让你用ie8)

其他像这样的还有好多,下面是我从从damn browser的截图。 是对该死的浏览器的一些小总结:

 

二 CSS

1.IE8 不支持  backgroud-size

比如我画一个背景,代码大概是这样的:

那么IE8就会爆炸。

如何hack?这样写:

background-image: url(/assets/my_bonus.gif);
    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='/assets/my_bonus.gif',
    sizingMethod='scale');

2.max-width

IE 可以种要求max-width 父元素宽度固定。所以可能存在chrome 正常,ie 爆炸的情况。

IE8不支持CSS3的很多新特性,不过我们可以使用一些比较成熟的hack方法,可以参考CSS3 PIE,它支持的特性有这些:border-radius、box-shadow、border-image、multiple background images、linear-gradient等。

三 HTML and HTML API

IE10+才有FileReaderAPI。 So 如果要解析文件。要polyfill 。  另外要说的是就算是IE10+ ,依然没有readAsBinaryString方法。。。。悲剧。。。

通过readAsArrayBuffer 模拟,然后挂在到对象原型链,代码:

// extend FileReader
            if (!FileReader.prototype.readAsBinaryString) {
                FileReader.prototype.readAsBinaryString = (fileData) => {
                    let binary = '';
                    const pt = this;
                    reader.onload = function (e) {
                        const bytes = new Uint8Array(reader.result);
                        const length = bytes.byteLength;
                        for (let i = 0; i < length; i++) {
                            binary += String.fromCharCode(bytes[i]);
                        }
                        pt.parseFile(binary);
                    };
                    reader.readAsArrayBuffer(fileData);
                };
            }
            reader.readAsBinaryString(file);

还有一些HTML5标签也是不能用的。

如果你在前端代码中使用了HTML5的新标签(header/footer etc),那么在IE中这些标签可能瞬间爆炸。我使用html5shiv

总结:

当然以上的这些都可以通过caniuse 查询, 比如: 我想使用FileReader。 通过canuse查询的结果是这个样子的。

所以我们就知道了IE8是不支持的  IE11部分支持 (红色不支持,黄色部分支持,绿色为支持)

对于不支持的我们可以hack之。  比如我前面hack的FileReader.readAsBinaryString()

②或者可以通过一些polyfill, 将浏览器不支持的特性hack出来。我们就可以像使用原生一样的使用它们。

还有各种增高垫(垫片shim)供大家选择。

③ linter  。    通过一些linter, 可以警告我们哪些潜在存在兼容性问题:

for  IE8 linter:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!