Почему аргументы обратного вызова Firefox setInterval отличаются от других браузеров? - PullRequest
3 голосов
/ 12 февраля 2011

Я тестировал этот скрипт в каждом браузере на Win 7. Он не работает только на Firefox (версия 3.6.13).

Окно оповещения возвращает «неопределенное» во всех браузерах, кроме Firefox, который возвращает случайное число. Вот сценарий

function nextSlide(nav){
    alert(nav);
}

jQuery(function(){
    var set = setInterval(nextSlide, 2000); 
});

Вот демоверсия

Ответы [ 2 ]

5 голосов
/ 12 февраля 2011

Дополнительным аргументом является количество миллисекунд, на которое обратный вызов опоздал.Из документации :

Аргументы обратного вызова

setInterval () будет передавать количество миллисекунд после вызова в функцию обратного вызова, что может запутатьесли он ожидает что-то еще в качестве аргумента.Чтобы обойти эту проблему, используйте анонимную функцию для вызова обратного вызова.

Исправление заключается в том, чтобы написать это вместо:

var set = setInterval(function() { nextSlide(); }, 2000);
1 голос
/ 12 февраля 2011

Марк Байерс правильно объяснил это документацией Mozilla.

Однако это расширение Firefox . Интерфейс WindowTimers - по крайней мере, как в HTML5 рабочий проект - фактически имеет другое требование. Конечно, поскольку это изменчивый домен ...

ручка = окно. setInterval (обработчик [, timeout [, arguments]])

Планирует время ожидания для запуска обработчика каждые миллисекунды. Любые аргументы передаются напрямую обработчику .

Следовательно, Firefox может рассматриваться как нарушение этого правила, так как arguments.length равен 1, даже если «аргументы не переданы».

Я считаю, что для HTML4 это просто реализация по умолчанию, без каких-либо определенных «официальных стандартов», или, по крайней мере, из тех, которые мне известны, и в этом случае Firefox может делать практически все, что ему угодно. Буду рад за исправление / справку.

Edit:

Firefox поддерживает поддержку передачи аргументов, как отметил Нил, и arguments.length всегда на единицу больше, чем количество аргументов, переданных для учета данных "смещения" - никакой магии не происходит сделано на arguments.length (что само по себе было бы страшно).

Это важно иметь в виду: не используйте и / или будьте осторожны при использовании arguments.length внутри функции обратного вызова таймера или столкновения с браузером. (Это встроено в другие обратные вызовы событий).

...