美文网首页让前端飞程序园Web前端之路
前端小纠结--自带“歧视性”的IE11 input事件迁移实践

前端小纠结--自带“歧视性”的IE11 input事件迁移实践

作者: 编程小世界 | 来源:发表于2019-07-03 22:40 被阅读1次

    ant-design-vue 的 RangePicker 在IE11下calendar panel无法正常展开,看图。

    具体的相关讨论看参考链接中的 ant-design-vue 部分。

    因为我知道IE和firefox、chrome下时间处理有问题(es5之前),以为是Date的问题,所以我的调试方向就走偏了,顺便介绍下Date.parse的行为,new Date('字符串'),内部使用Date.parse解析。

    Date.parse行为诡异

    参考链接部分有大量的Date知识总结,多多浏览。

    Date.parse 在ES5之前不同浏览器,行为差异很大。现在我只能重现一下IE下的,Chrome和firefox版本都太高,已经修正这个问题。

    // 控制台newDate('2019-07-02')// Tue Jul 02 2019 08:00:00 GMT+0800 (中国标准时间)newDate('2019/07/02')// Tue Jul 02 2019 00:00:00 GMT+0800 (中国标准时间)复制代码

    看到区别了吗?time部分,一个从0点开始,一个从8点开始,为啥呢?看看MDN怎么说吧。

    MDN文档不推荐在ES5之前使用Date.parse方法,因为字符串的解析完全取决于实现。直到至今,不同宿主在如何解析日期字符串上仍存在许多差异,因此最好还是手动解析日期字符串(在需要适应不同格式时库能起到很大帮助)。

    注意:如果你要兼容IE,对日期处理,请使用专门的类库,例如: moment.js, day.js 之类。

    Date#toString()

    顺便提一下,Date#toString()竟然有规范,看这里Date.toString,所以从Date字符串中解析提取一些字符可以放心大胆的用。以后推荐使用 Intl对象是 ECMAScript 国际化 API 的一个命名空间,它提供了精确的字符串对比、数字格式化,和日期时间格式化

    /** * 提取GMT时区 *@paramdate *@seehttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toString#Description *@returns''或者GMT,或者GMT+0000或者GMT-0000;其中0000代表GMT偏移量,是四位前两位表示hours小时,后两位表示minuts分钟. */functionextractTimezoneOffsetWithGMT(date){if(!date) {return'';  }constdateTimeStr = date.toString();// Thu May 23 2019 14:52:15 GMT+0800 (中国标准时间)constgmtIndexStart = dateTimeStr.indexOf('GMT');consttimezoneEnd = dateTimeStr.indexOf(' ', gmtIndexStart);returndateTimeStr.substring(gmtIndexStart, timezoneEnd);}复制代码

    placeholder和input事件

    和 ant-design-vue 维护者沟通之后,得知这个bug在 ant-design-vue 的英文语言模式下不会有问题,维护的小伙伴,推测语言环境不同,有可能导致编译的代码不同(也有道理,现在js都上编译器,你不知道编译后代码有多大变化,当时已经提到了placeholder,我没注意)。

    思路:英文版和中文版,最大的不同应该是语言文件,涉及到 RangePicker 只有 时间格式 和 placeholder ,时间格式已经怀疑过,因为底层使用moment库处理,所以没问题。所以只能看看placeholder兼容性。

    placeholder兼容性

    注意:看下 Known issues 的tab页签,看到第二条,我震惊了,为啥当placeholder为中文时会触发input事件???

    input事件的兼容性

    重现IE11当placeholder="中文"时,触发input事件

    <!DOCTYPE html>placeholderwindow.onload =function(){varenInput =document.getElementById('en');varcnInput =document.getElementById('cn');      enInput.addEventListener('input',function(evt){console.log('en inpu');      });      cnInput.addEventListener('input',function(evt){console.log('cn input');      });    }复制代码

    临时处理方案

    知道了原因就很容易处理了,只要input的placeholder=""就搞定了,虽然不好看,总比有bug好。

    <!-- 重置placeholder,因为默认有语言文件,placeholder默认有文字的 -->复制代码

    到这里才找到真正造成 RangePicker 问题的原因,反馈给了 ant-desing-vue 维护小伙伴,他们下次修复上线。

    如果有想学习编程的初学者,可来我们的前端直播授课群的哦:571671034里面免费送整套系统的前端教程!

    相关文章

      网友评论

        本文标题:前端小纠结--自带“歧视性”的IE11 input事件迁移实践

        本文链接:https://www.haomeiwen.com/subject/lgphhctx.html