【问题标题】:SetTimeout not delaying a function call [duplicate]SetTimeout 不延迟函数调用[重复]
【发布时间】:2012-02-07 22:05:10
【问题描述】:

谁能告诉我为什么下面代码中使用的 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();
}

任何帮助表示赞赏。

【问题讨论】:

  • setTimeout(function() { adjust_for_font(id); }, 2000)
  • 感谢辛你的明星!我还在习惯 javascript - 它有时会显示出来!再次感谢。

标签: javascript settimeout


【解决方案1】:

问题出在这一行

setTimeout(adjust_for_font(id),2000);

这不会安排adjust_for_font(id) 的调用,而是直接调用该函数并安排返回值。要安排函数的调用,请将调用包装在 lambda 中

setTimeout(function() { adjust_for_font(id); },2000);

【讨论】:

  • 这正是我所需要的,谢谢!
  • 对于未来的读者,使用 ES6 你也可以使用setTimeout( () => {adjust_for_font(id);}, 2000);,这样可以避免引用this 的问题。其他信息可用here
【解决方案2】:

通过不在您的函数周围加上引号,该函数将立即处理,setTimeout 将运行(但不会处理函数),您会想知道到底发生了什么。

setTimeout 被设计成这样运行:

setTimeout('adjust_for_font',2000);

或者在回调中使用匿名函数是另一种选择:

setTimeout(function(){adjust_for_font(id);}, 2000);

【讨论】:

  • '...想知道到底发生了什么' - 是的,这总结了我目前的 javascript 编程!!
【解决方案3】:

改变

setTimeout(adjust_for_font(id),2000);

setTimeout("adjust_for_font(id)",2000);

【讨论】:

  • 不错的建议,但仍然无法在某些版本的 safari 上运行。您最好将其设置为函数:setTimeout(function(){ adjust_for_font(id); }, 2000);
【解决方案4】:

这应该可以解决问题:

setTimeout(adjust_for_font, 2000, id);

我正在传递函数名称,将在 2000 毫秒后执行。在您的代码中,您传递了 adjust_for_font 的结果。函数名后面的括号会导致它在解析后立即执行(立即)。

【讨论】:

  • 并非所有浏览器都支持setTimeout() 的语法,并为延迟后指定的函数提供参数。在其他答案中使用匿名函数应该适用于所有浏览器。
【解决方案5】:

按照你写的方式,就好像adjust_for_font(id) 的输出是setTimeout 的第一个参数的输入。第一个参数应该是函数,而不是函数的结果。试试这个吧……

setTimeout(function() {
    adjust_for_font(id);
},2000);

【讨论】:

    【解决方案6】:

    SetTimeout 的语法是 setTimeout(function,milliseconds,param1,param2,...)

    这里的“函数”不是指函数的调用。它应该是真正的功能。

    所以你必须把你的代码改成

    setTimeout(adjust_for_font,2000,id); (注意:参数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
      }
      

      【讨论】:

      • JS 很白痴,但这几乎胜过我所见过的一切!虽然......这是我的解决方案,所以谢谢你!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      相关资源
      最近更新 更多