我将在我的网站上实现一个趋势功能,并想知道如何处理递归函数中的用户点击事件的最佳方法。
代码示例:
代码示例:
var trendingCodes = [];
// trendingCodes is json populated by ajax, this part works fine and not included for brevity
// looks like {code:'SadPanda', text:'Thanks for checking out my !shouttag', img:false}
// Kick this pig
showTrendingCode(0, 200);
function showTrendingCode(indexCurrent, fadeSpeed)
{
var indexNext = ((indexCurrent + 1) % trendingCodes.length);
var trendingCode = trendingCodes[indexCurrent];
if (trendingCodes.length > 1) {
// !!!! Problem
// I am trying to register an event handler for the 'next' trending code
// but if I click multiple times it causes a 'maximum stack exceeded' error
jQuery('#trending-refresh').off().on('click', function()
{
showTrendingCode(indexNext, 200);
});
jQuery('#trending-text p').add(jQuery('#trending-title span')).add(jQuery('#trending-refresh')).fadeIn(fadeSpeed);
setTimeout(function () { showTrendingCode(indexNext, 600); }, 5000);
}
}
从代码中可以看到,我正试图为一个DOM元素(next)注册事件处理程序,但如果用户多次点击该链接,将会得到“ maximum stack exceeded”错误。如果用户根本没有点击,则函数会一直运行(这是期望的效果)。
有什么建议可以使它按预期工作吗?
showTrendingCode
两次,一次来自点击事件,一次来自你的setTimeout
,我相信这就是问题的根源。如果发生点击事件,你应该在setTimeout
之前返回。 - RickTakes.on()
替换为.one()
。 - guest271314