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
}