Я пытаюсь использовать замыкание, чтобы функция могла выполняться только один раз.Звучит просто, и это работает так:
function runOnce(fn) // returns copy of fn which can only execute once
{
var ran = false;
return function()
{
if (!ran)
{
fn();
ran = true;
}
};
}
Я проверил функцию следующим образом:
function lazyLoadGrid(event, ui)
{
alert('hi');
}
var test1 = runOnce(lazyLoadGrid);
var test2 = runOnce(lazyLoadGrid);
test1();
test2();
test1();
test2();
И она работает, как и ожидалось - «привет» получает предупреждение ровно дважды.
Но затем я пытаюсь использовать runOnce (lazyLoadGrid) в качестве обратного вызова для события пользовательского интерфейса jQuery:
$('.accordion').each(function()
{
$(this).accordion({ autoHeight: false, change: runOnce(lazyLoadGrid) });
});
И наступает безумие.Я ожидаю, что каждый «аккордеон» на странице будет запускать lazyLoadGrid () ровно один раз, когда этот аккордеон впервые открывается.Вместо этого обратные вызовы замыкания, похоже, ведут себя так, как будто все они ссылаются на одну и ту же копию run.lazyLoadGrid () запускается в первый раз, когда я открываю любой аккордеон, а затем никогда больше не запускается для любого другого аккордеона.Запись предусловия 'run' показывает, что оно 'true' каждый раз, когда я нажимаю на любой аккордеон после первого.
Как это можно объяснить?Возможно, стоит отметить, что у меня есть нечетная страница с вложенными аккордеонами и несколькими вкладками jQuery UI, каждая из которых содержит аккордеоны.Что еще хуже, когда я переключаю вкладки, закрытие фактически запускается на первом открытом аккордеоне любой данной вкладки.Любой совет очень ценится.