兼容随记

106 阅读4分钟

记录的是平时遇见的兼容问题等,也是为了自己能保持记录问题的习惯。

一、关于时间转换的个问题

前几天做了个活动页,里面有个倒计时的需求,随后封装了个倒计时的函数。结果再调用传参后一个没注意就出现了问题,问题不大随手记录下,以防下次在出现类型的问题。

var setRemainTime = function(timeStr,item){
    setInterval(function(){
        var nowTime = new Date(timeStr) - new Date();
        var minutes = parseInt(nowTime / 1000 / 60 % 60,10);
        var seconds = parseInt(nowTime / 1000 % 60, 10);
        
        minutes = checkTime(minutes);
        seconds = checkTime(seconds);
        
        if(nowTime >= 0 ){
            var days = parseInt(nowTime / 1000 / 60 / 60 / 24,10);
            var hours = paresInt(nowTime / 1000 / 60 / 60 % 24,10);
            days = checkTime(days);
            hours = checkTime(hours);
            $('.dyas').text(days);
            $('.hours').text(hours);
            $('.minutes').text(minutes);
            $('.seconds').text(seconds);
        }
    },1000)
}

function checkTime(i){
    if(i< 10 ){
        i = '0' + i;
    }
    return i;
}

//调用方法时出错
var init = function(){
    setRemainTime('2019-5-1 16:00:00','day');
}
init();

以上是封装的倒计时方法,相信已经看出问题所在了。是的,在调用 setRemainTime ()方法时,传参的格式问题,虽然是字符串没错了,但是时间分割是以 ‘ - ’ 分割,导致在IE里直接显示NaN,就是因为一个不小心,不注意出现的问题,我还纠结了好一会儿。后来发现是传参的问题改正后就没有问题。
正确传参格式:
setRemainTime('2019/5/1 16:00:00','day');


二、判断否支持video标签

html5中新增了video标签,可用于播放视频,功能强大。但是当前很多浏览器还不支持,所以在使用时需要判断当前浏览器是否支持此标签。

我们的页面在不同浏览器上之所以会出现变现不同的问题,是因为不同的浏览器在解析页面时,遵循的规则并不是完全相同的。

方法一 :条件注释判断浏览器版本

<div class="viedeo">
    <video id="video" controls preload="auto">
        <source src="//wan05.sogoucdn.com/cdn/video/2019/05/22/20190522163317_3460.mp4" />
        <!--<p class="err">您的浏览器不支持video标签</p> -->
     </video>
    <!-- 视频媒体标签IE6以上可识别 -->
        <!-- [if gte IE 6] -->
            <p class="err">您的浏览器不支持video标签</p>
        <![endif]-->
    <!-- 音频媒体标签 -->
        <a href="javaScript:;" class="videoMask" id="videoMask"></a>
</div>

在html页面中可以使用条件注释判断浏览器版本,可以解决IE下的兼容问题。

那条件注释有哪些:

<!-- [if !IE] --><!--> 除IE外都可识别<![endif]-->
<!-- [if IE]>所有IE外都可识别<![endif]-->
<!-- [if IE 6]> 仅IE6可识别<![endif]-->
<!--[if lt IE 6]> IE6以及IE6以下版本可识别 <![endif]-->
<!--[if gte IE 6]> IE6以及IE6以上版本可识别 <![endif]-->
<!--[if IE 7]> 仅IE7可识别 <![endif]-->
<!--[if lt IE 7]> IE7以及IE7以下版本可识别 <![endif]-->
<!--[if gte IE 7]> IE7以及IE7以上版本可识别 <![endif]-->
<!--[if IE 8]> 仅IE8可识别 <![endif]-->
<!--[if IE 9]> 仅IE9可识别 <![endif]-->

方法二:

var supVideo = !!document.createElement('video').canPlayType;

$('#closeVideo').click(function(e){
   e.preventDefault();
   $('.gameVideo').hide();
  /*
   暂停视频
   jquery 不可以直接使用play()等方法,而是dom元素的函数
   */
    if(!supVideo){
        return;
    }
   $('#video').get(0).play();
    if ($('#video').pause) {
        // 触发被选元素的指定事件
        $('#video').trigger('play');
    }else{
        $('#video').trigger('pause');
    }     
});

在点击播放前检测浏览器是否能播放指定的音频。
canPlayType()方法可返回下列值之一:
  • probably --- 浏览器可能支持该音频
  • maybe ---浏览器也许支持该音频
  • '' ---(空字符串)浏览器不支持
canPlayType()方法所有主流浏览器都支持;


 目前这两种方法都有使用到,其他更高效好用的方法还需要去发掘。 三 placeholder 兼容问题 placeholder是html新增的属性,当input或者textarea设置了该属性后,该值的内容将作为灰字提示显示在文本框。 在实践中发现jquery对 placeholder支持不是很理想,placeholder属性值时而会消失,所以建议用原生js方案。

function placeholder() {  
    var doc=document,  
        inputs=doc.getElementsByTagName('input'),  
        //浏览器input域是否支持placeholder  
        supportPlaceholder='placeholder'in doc.createElement('input'),  
        placeholder=function(input){  
            var text=input.getAttribute('placeholder'),  
            defaultValue=input.defaultValue;  
            if(defaultValue==''){  
                input.value=text  
            }  
            input.onfocus=function(){  
                if(input.value===text){  
                    this.value=''  
                }  
            };  
            input.onblur=function(){  
                if(input.value===''){  
                    this.value=text  
                }  
            }  
        };  
        if(!supportPlaceholder){  
            for(var i=0,len=inputs.length;i