伙计,这很有趣。在 IE8中以一种非常奇怪的方式Array.prototype.splice
被破坏。
我必须向你展示这个(如果你愿意,可以跳过它,下面的解决方案)。
如您所见,这会在 IE 中提醒“a”,对吗?
// Create an array-like object.
var arrayLike = {
length: 1,
'0': 'a'
};
// Clean it with splice. This should work in ES5.
Array.prototype.splice.call(arrayLike, 0, 2);
// Note that IE does set the length to zero. We need to check an item.
alert(arrayLike[0]);
jsfiddle。
现在,如果我们将其设置为无效长度怎么办?特别是对于这种效果,“3”(“2”将在 IE8 中产生相同的结果)。
现在,IE8中的这个警报是什么?
var arrayLike = {
length: 3, // <--
'0': 'a'
};
Array.prototype.splice.call(arrayLike, 0, 2);
alert(arrayLike[0]);
jsfiddle。
无论如何,我不会依赖那种奇怪的工作方式,我不想在生产中出现一个可怕的奇怪错误。这是你修复它的方法:
首先,您的代码包含在 IIFE 中,对吗?你应该。其次,检查您是否拥有Array.prototype.splice
. 我在我的 IIFE 开始时声明了这些事情。
// Call it whatever you want.
var protoSplice = Array.prototype.splice;
然后,在一些初始化方法上(或者在你想要的任何时候,确保它在你使用它之前),调用一个 polyfill 方法。
polyfill();
调用测试和修复。
function polyfill() {
// ...
genericSpliceWorks() || fixGenericSplice();
// ...
}
以下是它使用的方法:
function genericSpliceWorks() {
// Create an array-like object.
var arrayLike = {
length: 1,
'0': true
};
// Clean it with splice. This should work in ES5.
protoSplice.call(arrayLike, 0, 2);
// Note that IE does set the length to 0. We need to check an item.
return !arrayLike[0];
}
function fixGenericSplice() {
// Re-set our local protoSplice variable to something that works.
// Note: this implementation only works with the first two arguments
// of splice. This means that it does not add extra elements to the
// array. It's as much as I need.
protoSplice = function(index, count) {
// If count is more than zero, run until it's zero, decrementing
// each time.
while (count--) {
// Remove an array item from index, while incrementing index
// for the next time.
delete this[index++];
// Decrement the length.
this.length--;
}
};
}
达达!它现在可以工作了:)