Функция setTimeout всегда доставляет мне неприятности. Прямо сейчас у меня есть функция, которая является рекурсивной (вызывает себя через setTimeout) и изменяет высоту элементов.
Функция отправляет два аргумента: изменяемый элемент и максимальная высота элемента. Цель функции - развернуть элемент или «скользить вниз» в постоянном темпе. Я знаю, что, возможно, смогу решить эту проблему с помощью jQuery, но я пробую свою собственную функцию.
function slide_down(element, max_height)
{
if(element.clientHeight < max_height)
{
var factor = 10;
var new_height = (element.clientHeight + factor >= max_height) ? max_height : (element.clientHeight + factor);
element.style.height = new_height + 'px';
var func_call = 'slide_down(' + element + ', ' + max_height + ');';
window.setTimeout(func_call, 10);
}
}
Я проверил аргументы при первоначальном вызове функции. max_height установлен в 20, потому что это желаемая высота элементов (я получил это значение из .scrollHeight).
Когда функция завершена, я хочу, чтобы она вызывала себя до тех пор, пока max_height не станет высотой элемента. Я делаю это с помощью этого вызова setTimeout:
var func_call = 'slide_down(' + element + ', ' + max_height + ');';
window.setTimeout(func_call, 10);
И это не работает. ЭТО работает:
var func_call = 'alert(1);';
window.setTimeout(func_call, 10);
Я также пытался поместить вызов функции непосредственно в оператор setTimeout, но он по-прежнему не работает.
Обратите внимание, что высота элемента изменяет первую итерацию, функция просто никогда не вызывает себя. Таким образом, переменная элемента установлена правильно, и я использовал alert () для отображения max_height, что также правильно.
alert(func_call);
Оповещает об этом:
slide_down([object HTMLParagraphElement], 20);