IE <= 8.splice() не работает
У меня есть простой код, который вы можете увидеть в моей скрипке. Он корректно предупреждает обо всех браузерах и IE9, но не IE8 или 7.
var func = function( x ) {
var slice = [].slice,
args = slice.call( arguments ),
pass = args.splice(1);
alert( pass );
};
func( 'a', 1, 2 );
ИЗМЕНИТЬ
Используя решение, я опубликовал то, что я использовал здесь:
http://jsfiddle.net/7kXxX/4/
Я использую это в случае, когда я не знаю, сколько аргументов подходит, поэтому я использую "аргументы"
Ответы
Ответ 1
стандарт ECMAScript 3rd edition требует второй аргумент deleteCount
:
Array.prototype.splice(start, deleteCount [, item1 [, item2[,...]]])
Документы MSDN показывают, что IE следует этому стандарту:
arrayObj.splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]])
Firefox SpiderMonkey позволяет второй аргумент быть дополнительным (как и другие современные браузеры):
array.splice(index , howMany[, element1[, ...[, elementN]]])
array.splice(index[, howMany[, element1[, ...[, elementN]]]])
Описание:
howManyЦелое число, указывающее количество старых элементов массива для удаления. Если howMany равен 0, элементы не удаляются. В этом случае вы должен указывать хотя бы один новый элемент. Если параметр howMany не указан (второй синтаксис выше, который является расширением SpiderMonkey), все элементы после индекса удаляются.
Источники:
Ответ 2
Сплит имеет требуемый второй аргумент:
http://jsfiddle.net/7kXxX/2/
pass = args.splice(1,2);
Дополнительный второй аргумент - это расширение в новых браузерах, которые принимают остальную часть массива, если оставить undefined
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice
Slice будет более подходящим, если вы хотите, чтобы элементы от 1 до конца, не похоже, что есть какая-то причина для удаления элементов из args.
Ответ 3
Мое решение для Array.prototype.splice в IE (подробнее здесь):
(function () {
'use strict';
var originalSplice = Array.prototype.splice;
Array.prototype.splice = function (start, deleteCount) {
// convert the weird, not-really-an-array arguments array to a real one
var args = Array.prototype.slice.call(arguments);
// IE requires deleteCount; set default value if it doesn't exist
if (deleteCount === undefined) {
args[1] = this.length - start;
}
// call the original function with the patched arguments
return originalSplice.apply(this, args);
};
}());
Ответ 4
var func = function (x)
{
alert ([].slice.call (arguments, 1))
}
func( 'a', 1, 2 );
Ответ 5
Я не знаком с этой конкретной проблемой, но вы пробовали Sugar.js? У него есть некоторые методы, которые могут сработать для вас (я считаю, что замена сплайсинга будет работать).