SetTimeout не задерживает вызов функции
Может кто-нибудь, пожалуйста, скажите мне, почему setTimeout, используемый в приведенном ниже коде, не работает? Он просто запускает функцию сразу.
function change_txt_font(elem, id, text_fnt){
current_width = parseInt($('#span_text'+id).css('width'));
current_height = parseInt($('#span_text'+id).css('height'));
current_font_size = parseInt($("#span_text"+id).css("font-size"));
parent.document.getElementById(elem+'_f').value=text_fnt;
$('#span_text'+id).css('font-family',text_fnt);
$('#'+elem).css('font-family',text_fnt);
setTimeout(adjust_for_font(id),2000);
}
function adjust_for_font(id){
alert("function")
alert("id = "+id)
new_height = parseInt($('#span_text'+id).css('height'));
new_width = parseInt($('#span_text'+id).css('width'));
width_ratio = parseFloat(current_width/new_width)
height_ratio = parseFloat(current_height/new_height)
new_font_size = current_font_size * Math.min(width_ratio,height_ratio)
$("#text"+id).css("font-size", (parseFloat(new_font_size) - 1) + "px");
$("#span_text"+id).css("font-size", (parseFloat(new_font_size) - 1) + "px");
document.getElementById("form_front_text"+id).submit();
}document.getElementById("form_front_text"+id).submit();
}
Любая помощь была оценена.
Ответы
Ответ 1
Проблема заключается в этой строке
setTimeout(adjust_for_font(id),2000);
Это не назначает вызов adjust_for_font(id)
, а вместо этого вызывает функцию напрямую и отображает возвращаемое значение. Чтобы запланировать вызов функции, завершите вызов в лямбда
setTimeout(function() { adjust_for_font(id); },2000);
Ответ 2
Не помещая кавычки вокруг вашей функции, функция будет обрабатываться немедленно, setTimeout будет запускаться (но не будет обрабатывать функцию), и вам остается недоумевать, что произошло на земле.
setTimeout предназначен для работы следующим образом:
setTimeout('adjust_for_font',2000);
Или использование анонимной функции в обратном вызове - это еще одна опция:
setTimeout(function(){adjust_for_font(id);}, 2000);
Ответ 3
Измените
setTimeout(adjust_for_font(id),2000);
к
setTimeout("adjust_for_font(id)",2000);
Ответ 4
Это должно сделать трюк:
setTimeout(adjust_for_font, 2000, id);
Я передаю имя функции, которое должно быть выполнено, когда прошло 2000 миллисекунд. В коде вы передаете результат adjust_for_font. Скобки после имени функции заставляют его выполнять, как только он разбирается (сразу).
Ответ 5
То, как вы его написали, как будто вывод adjust_for_font(id)
является входом в первый параметр setTimeout
. Первым параметром должна быть функция, а не результат функции. Попробуйте это вместо этого...
setTimeout(function() {
adjust_for_font(id);
},2000);
Ответ 6
Синтаксис SetTimeout - setTimeout (функция, миллисекунды, param1, param2,...)
Здесь "функция" означает не вызов функции. Это должна быть реальная функция.
Итак, вам нужно изменить свой код на
SetTimeout (adjust_for_font, 2000, ID); (примечание: Идентификатор параметра должен пройти после параметра миллисекунды)
или, альтернативно, вы можете установить первый параметр ниже:
setTimeout (function() {adjust_for_font (id);}, 2000);
Ответ 7
Это из моего опыта. Просто указание setTimeout() приведет к тому, что он будет выполняться при самой загрузке страницы, даже если его родительская функция не вызывается. превращая его в такую переменную, как это работает.
перед
function xyz(){
//do something if needed
setTimeout(function abc, duration);
//setTimeout will be executed even before xyz() call
}
после
function xyz(){
//do something if needed
var t=setTimeout(function abc, duration);
//this time, setTimeout will be executed upon xyz() call and not upon pageload
}