Подтвердить что ты не робот

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/

Я использую это в случае, когда я не знаю, сколько аргументов подходит, поэтому я использую "аргументы"

4b9b3361

Ответ 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? У него есть некоторые методы, которые могут сработать для вас (я считаю, что замена сплайсинга будет работать).