Я пытаюсь использовать замыкание, чтобы гарантировать, что функция может выполняться только один раз. Звучит просто, и он работает следующим образом:
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 UI:
$('.accordion').each(function()
{
$(this).accordion({ autoHeight: false, change: runOnce(lazyLoadGrid) });
});
И приходит безумие. Я ожидаю, что каждый "аккордеон" на странице будет запускать lazyLoadGrid() ровно один раз, когда этот аккордеон будет сначала открыт. Вместо этого обратные вызовы замыкания, похоже, ведут себя так, как будто все они ссылаются на одну и ту же копию "ran". lazyLoadGrid() запускает первый раз, когда я открываю любой аккордеон, а затем никогда не запускается снова для любого другого аккордеона. Запись значения pre-condition из "ran" показывает, что он "true" каждый раз, когда я нажимаю любой аккордеон после первого.
Каково объяснение этого? Возможно, стоит отметить, что у меня есть нечетная страница с вложенными аккордеонами и несколькими вкладками пользовательского интерфейса jQuery, каждая из которых содержит аккордеоны. Хуже того, когда я переключаю вкладки, закрытие фактически выполняется на первом открытом аккордеоне любой данной вкладки. Любые советы очень ценятся.