我正在尝试用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变量时得到随机数。我看不出错误在哪里。
事先谢谢。
答案 0 :(得分:4)
Firefox(13之前版本)将参数传递给您的间隔处理程序。该参数给出了函数调用的“迟到”;换句话说,应该被调用的毫秒数。
请参阅黄色警告here:
注意:在Gecko 13之前(Firefox 13.0 / Thunderbird 13.0),Gecko 将一个额外的参数传递给回调例程,指示 超时的“实际延迟”,以毫秒为单位。这不规范 不再提供参数。
答案 1 :(得分:4)
使用以下代码:
var self = this; // preserve this to be used inside the callback
setInterval(function() { self.update(); }, 3000)
通常你所做的会有效,但有些(Gecko-based)浏览器会将参数传递给定时器回调函数。
答案 2 :(得分:0)
setInterval每3秒调用一次.update。 update会有一个对象的引用(this),但是我看不到它会如何在gameToDisplay中传递。
删除gameToDisplay,因为它看起来是多余的,或者将其设置为displayGame之类的实例变量,并将其设置为独立于update()。
在大多数情况下,它将为null,但Firefox显然会传递某种参数。