2012-02-07 35 views
11

¿Alguien puede decirme por qué el setTimeout utilizado en el siguiente código no funciona? Simplemente ejecuta la función de inmediato.SetTimeout no retrasa una llamada de función

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(); 
} 

Cualquier ayuda apreciada.

+4

'setTimeout (function() {adjust_for_font (id);}, 2000)' – Sim

+0

Gracias Sim your a star! Todavía me estoy acostumbrando a javascript, ¡y se muestra a veces! Gracias de nuevo. –

Respuesta

2

La forma en que lo tiene escrito, es como si la salida de adjust_for_font(id) fuera la entrada al primer parámetro de setTimeout. El primer parámetro debe ser la función, no el resultado de la función. Prueba este lugar ...

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

El problema es esta línea

setTimeout(adjust_for_font(id),2000); 

Esto no programa la invocación de adjust_for_font(id) sino que invoca la función directa y horarios del valor de retorno. Para programar la invocación de la función de envolver la llamada en una lambda

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

Gracias por esto. –

+0

Esto es exactamente lo que necesitaba, ¡gracias! – RichieMN

5

Por no poner comillas alrededor de su función, la función procesará inmediatamente, se ejecutará setTimeout (pero no procesará una función) y que está Me pregunto qué pasó en la tierra.

setTimeout está diseñado para funcionar de esta manera:

setTimeout('adjust_for_font',2000); 

O un uso de una función anónima en la devolución de llamada es otra opción:

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

'... se quedó pensando qué pasó en el mundo' - ¡¡Sí, eso resume mi programación javascript en este momento !! –

3

Cambio

setTimeout(adjust_for_font(id),2000); 

a

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

No es una mala sugerencia, pero todavía no funcionará en ciertas versiones de safari. Lo mejor es simplemente configurarlo en la función como: 'setTimeout (function() {adjust_for_font (id);}, 2000);' – SpYk3HH

3

Esto debe hacer el truco:

setTimeout(adjust_for_font, 2000, id); 

estoy pasando el nombre de la función, a ser ejecutado cuando han pasado 2000 milisegundos. En su código, está pasando el resultado de adjust_for_font. Los corchetes después del nombre de la función provocan que se ejecute tan pronto como se analiza (de forma inmediata).

+0

No todos los navegadores admiten la sintaxis de 'setTimeout()' con un argumento para la función especificado después de la demora. Usar una función anónima como en las otras respuestas debería funcionar en todos los navegadores. – nnnnnn

0

Esto es de mis experiencias. Solo al especificar setTimeout() hará que se ejecute al cargar la página, incluso si no se llama a su función principal. lo que lo convierte en una variable como esto funciona ..

antes

function xyz(){ 
    //do something if needed 
    setTimeout(function abc, duration); 
    //setTimeout will be executed even before xyz() call 
} 

después de la sintaxis

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 
} 
1

El SetTimeout es setTimeout (función, milisegundos, param1, param2, .. .)

Aquí "función" no significa la llamada de t él función. Debería ser la función real.

Así que hay que cambiar el código para

setTimeout (adjust_for_font de 2000, id); (nota: El parámetro id debe pasar después del parámetro milisegundos)

o, alternativamente, se puede establecer el primer parámetro como bramido

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

Cuestiones relacionadas