扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在几个月前我们在微构网络官网上面发布过一篇名为《基于七牛云JavaScript SDK一行代码实现大文件分片断点续传》的文章,这篇文章在网上应该至少被数百人次查阅过,也接到好几个人进一步的问题咨询。其中有一个问题是一个共性问题,都认为这里面的代码有问题,在IE浏览器上面执行不了。我们一般写博客文章分享的时候,都是仅提供核心代码,而不是完整的项目代码;主要是两个原因:1、在一篇短文中贴出所有代码,不能突出核心问题所在;2、我们是比较反感完完全全的伸手党的。
如果仅仅按照文章中的核心代码,直接去跑demo,那么在ie浏览器下确实会出现上传无效,打开控制台就可以看到报错信息。
原因在于在七牛云JavaScript SDK qiniu.min.js中使用了includes()方法,这个方法用于判断字符串是否包含指定的子字符串, 如果找到匹配的字符串则返回 true,否则返回 false。浏览器的支持情况如下:
很显然在IE浏览器上默认是不被支持的,那么应该怎么办呢?
解决办法一:使用其他方法属性代替includes()
这种方法适合自己手写的局部代码,如果是使用SDK等现成的,我们不太建议修改其核心源代码。
解决方法二:使得IE浏览器支持includes,也就是另外些一个这个方法
以下自己构建includes方法的代码参考网络其他资料而来,其他IE不支持的方法也可以参考如下代码实现。
if (!Array.prototype.includes) { Object.defineProperty(Array.prototype, "includes", { value: function(valueToFind, fromIndex) { if (this == null) { throw new TypeError('"this" is null or not defined'); } var o = Object(this); var len = o.length >>> 0; if (len === 0) { return false } var n = fromIndex | 0; var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); function sameValueZero(x, y) { return (x === y || (typeof x === "number" && typeof y === "number" && isNaN(x) && isNaN(y))) } while (k < len) { if (sameValueZero(o[k], valueToFind)) { return true } k++ } return false } }) }
当然,这种方法也适用于其他js库使用了includes()方法的场景,也是一样的道理,就是自己“外挂”构造实现includes的方法。
这也说明,我们在选择技术实现方案的时候,一定要根据我们开发项目的实际场景选择。而不是一味地追求技术的新颖,而不管三七二十一一顿乱上,这样或许会留下填不完的坑。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流