IE8兼容那些事(包括react)

CSS

  • IE浏览器hack

@media \0screen {} //IE8的hack

其他hack:http://www.cnblogs.com/PeunZhang/archive/2012/04/09/2437563.html

  • IE8实现背景半透明,内容不透明

高版本浏览器用rgba可完美解决,但IE8不支持rgba,需要利用滤镜解决。另外IE9下rgba和filter都生效,会造成双倍透明效果,也需要注意。提供两个解决方案:

//现代浏览器
    background: rgba(0, 0, 0, .7);
  
//第一种 利用滤镜的渐变,但对于白色背景无效,不需要加IE8 hack;
    filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7F000000, endcolorstr=#7F000000);
//第二种 position必须为static子元素为relative,子元素才不会透明;且父元素不能用z-index,要用的话再套一层“爷爷”元素,给爷爷设置z-index;需要加IE8 hack;
    @media \0screen {
        background: #000;
        filter: Alpha(opacity=70);
    }


JS

  • IE8下event对象

IE8的event对象是挂载在window对象下的,阻止冒泡等,也有不同的实现。以阻止冒泡为例:

function stopPropagation(e){

    var e = e || window.event; //IE8的event对象挂载在window下,函数参数未自带

    (e.stopPropagation) ? e.stopPropagation(): e.cancelBubble = true; //阻止冒泡

}

其他类似

阻止冒泡:(e.stopPropagation) ? e.stopPropagation(): e.cancelBubble = true;

阻止默认事件:(e.preventDefault) ? e.preventDefault(): e.returnValue = false;

获取点击元素:var target = e.target || e.srcElement;

  • IE 8下小心使用console.log

在IE8中要想使用它调试代码必须要先开启F12,如果不开启F12,在浏览器的下方就会显示报错。那是因为IE8会将console.log()默认处理为错误逻辑,但是在F12下处理为控制台输出。比较有意思的是,但我们将F12关闭,刷新页面,IE8 仍然将console.log()处理为控制台输出,即打开过一次F12,就会一直识别console.log()。因此我们常常会在调试后忘记删除console.log()语句。

怎样让报错重现:开启一次F12后,会识别console.log()。我们需要清空浏览器缓存,再重启浏览器,不打开F12,就会重现了。我们应该做的是养成好的编程习惯,不要滥用console.log(),调试后记得注释掉或删掉调试代码。如有必要,可引入相应shim。

  • IE8变量类型判断

Object.prototype.toString.call(null | undefined) === '[object Object]',而chrome为[object Null]、[object Undefined]

  • IE8的application/json兼容问题

IE8用iframe处理上传文件时(如ant design),如果返回的content-type:application/json,会被当成文件,触发下载;另外不用iframe时,虽然不会触发下载,但是也会被当成文件走缓存策略(如304),使得接口数据不变。

1、触发下载的问题,需要后端对返回的content-type修改成 text/plain或 text/html。但也要注意副作用,较稳妥的做法是后端判断agent是否为IE8 IE9,单独设置content-type。

2、接口数据被缓存的问题,如果按1的方式修改了content-type应该就不会出问题了(没亲自试过)。另一种思路是每个请求都加个时间戳参数。

https://github.com/react-component/upload#ie89-note


SHIM

注意:所有shim已加入公用cdn,具体请访问前端静态资源CDN列表,有较详细备注。所有shim可按如下方式引用

<!--[if lt IE 9]>
<script src="//st01.chrstatic.com/themes/chr-cdn/html5shiv/v3.7.3/html5shiv.min.js"></script>
<![endif]-->

  • html5shiv

让低版本浏览器支持html5标签,详见:https://github.com/aFarkas/html5shiv

  • Respond

让低版本浏览器支持@media响应式,详见:https://github.com/scottjehl/Respond

  • es5-shim

让低版本浏览器支持ES5方法,详见:https://github.com/es-shims/es5-shim

待补充:fetch、json、console等

LIBS

  • jquery

v1.12.x支持IE6/7,v1.13.x支持IE8

  • react

v0.14.x支持IE8

https://github.com/xcatliu/react-ie8

  • react-router

v2.x支持IE8

  • ant design

v1.x 支持IE8

  • swiper

v2.x支持IE8

react+webpack兼容IE8的配置

首先react要v0.14.x以下,以下代码均以react v0.14.8+webpack2为基础,其他版本请自行调整。

  1. html要做好es5的兼容准备,引入各种shim,做好内核切换等,参考

    项目初始化——HTML模板

  1. webpack配置react、ES5转译,以及postcss等loader(最关键也是最麻烦的)

 

//开发环境配置,不压缩,需要es3ify-loader处理IE8保留字
module: {
    rules: [{
        test: /\.(js|jsx)$/,
        include: /src/,
        use: [
            //es3ify-loader必须
            "es3ify-loader", {
                loader: 'babel-loader',
                options: {
                    presets: ['es2015', 'react']
                }
            }
        ]
    }, {
        test: /\.(css|scss)$/,
        include: /src/,
        use: ExtractTextPlugin.extract({
            fallback: "style-loader",
            use: ["css-loader", {
                loader: "postcss-loader",
                options: {
                    plugins: function() {
                        return [
                            require('autoprefixer')({ browers: ['ie >=8', 'last 5 versions'] }) //自动加低版本前缀
                        ];
                    }
                }
            }, "sass-loader"]
        })
    }]
}
//生产环境,需要压缩,不需要es3ify-loader,但需要配置UglifyJsPlugin插件
plugins: [
    new webpack.optimize.UglifyJsPlugin({
        mangle: {
            screw_ie8: false,
            //mangle 通过设置except数组来防止指定变量被改变 (防止指定变量被混淆) 
            except: ['$super', '$', 'exports', 'require']
        },
        output: {
            screw_ie8: false, //必须
            comments: false //是否有注释
        },
        compress: {
            screw_ie8: false, //必须
            warnings: false //是否显示警告
        }
    })
],
module: {
    rules: [{
        test: /\.(js|jsx)$/,
        include: /src/,
        use: [{
            loader: 'babel-loader',
            options: {
                presets: ['es2015', 'react']
            }
        }]
    }, {
        test: /\.(css|scss)$/,
        include: /src/,
        use: ExtractTextPlugin.extract({
            fallback: "style-loader",
            use: [{
                loader: "css-loader",
                options: {
                    minimize: true //压缩css
                }
            }, {
                loader: "postcss-loader",
                options: {
                    plugins: function() {
                        return [
                            require('autoprefixer')({ browers: ['ie >=8', 'last 5 versions'] })
                        ];
                    }
                }
            }, "sass-loader"]
        })
    }]
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值