0

我正在尝试用 JavaScript 编写自己的幻灯片放映。我已经拥有的是在 Opera、Safari 和 Chrome 中工作的骨架:

var slideShow = (function() {
    var latestGames = document.getElementById('latestGames').getElementsByTagName('li');
    var displayedGame = 0;
    return {
        init: function() {
            latestGames[displayedGame].style.display = 'inline';
            setInterval(this.update, 3000);
        },
        update: function(gameToDisplay) {
            console.log("Displayed game: " + displayedGame);
            latestGames[displayedGame].style.display = 'none';
            gameToDisplay = gameToDisplay || (displayedGame === (latestGames.length - 1) ? 0 : ++displayedGame);
            console.log("Game to display: " + gameToDisplay);
            console.log('====================');
            latestGames[gameToDisplay].style.display = 'inline';
            displayedGame = (gameToDisplay == latestGames.length ? 0 : gameToDisplay);
        }
    }
})();

但是在 Firefox 中,当我记录 gameToDisplay 变量时,我只会得到随机数。我看不到错误在哪里。

预先感谢。

4

3 回答 3

4

Firefox (pre-13) 将参数传递给您的间隔处理程序。参数给出函数调用的“迟到”;换句话说,它应该被调用的毫秒数。

请参阅此处的黄色警告:

注意:在 Gecko 13 (Firefox 13.0 / Thunderbird 13.0) 之前,Gecko 向回调例程传递了一个额外的参数,以毫秒为单位指示超时的“实际延迟”。不再提供此非标准参数。

于 2012-05-28T22:26:05.523 回答
4

使用以下代码:

var self = this; // preserve this to be used inside the callback
setInterval(function() { self.update(); }, 3000)

通常你所做的会起作用,但是一些(基于 Gecko 的)浏览器将参数传递给计时器回调函数。

于 2012-05-28T22:27:01.150 回答
0

setInterval 每 3 秒调用一次 this.update。update 将对对象有一个引用(this),但我看不出它会如何在 gameToDisplay 中传递。

要么删除 gameToDisplay,因为它看起来是多余的,要么将其设为像 displayGame 这样的实例变量,并独立于 update() 设置它。

在大多数情况下,它将为空,但 Firefox 显然传递了某种参数。

于 2012-05-28T22:28:42.280 回答