2012-02-07 19 views
11

Qualcuno può dirmi perché il setTimeout utilizzato nel codice riportato di seguito non funziona? Esegue semplicemente la funzione immediatamente.SetTimeout non ritardare una chiamata di funzione

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

Qualsiasi aiuto apprezzato.

+4

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

+0

Grazie Sim la tua stella! Mi sto ancora abituando a javascript - e mostra a volte! Grazie ancora. –

risposta

2

Il modo in cui lo hai scritto è come se l'output di adjust_for_font(id) fosse l'input del primo parametro di setTimeout. Il primo parametro dovrebbe essere la funzione, non il risultato della funzione. Prova a ...

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

Il problema è questa linea

setTimeout(adjust_for_font(id),2000); 

Ciò non pianificare l'invocazione di adjust_for_font(id) ma invoca invece la funzione direttamente e orari il valore restituito. Per pianificare l'invocazione della funzione di avvolgere la chiamata in una lambda

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

Grazie per questo. –

+0

Questo è esattamente quello di cui avevo bisogno, grazie! – RichieMN

5

da non mettere tra virgolette la funzione, la funzione elaborerà immediatamente, setTimeout verrà eseguito (ma non elaborerà una funzione) e il gioco è lasciato chiedendo cosa diavolo è successo.

setTimeout è progettato per funzionare in questo modo:

setTimeout('adjust_for_font',2000); 

O un utilizzando una funzione anonima nel callback è un'altra opzione:

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

'... lasciato a chiedersi cosa diavolo è successo' - sì che su riassume la mia programmazione javascript al momento !! –

3

Change

setTimeout(adjust_for_font(id),2000); 

a

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

Non è un cattivo suggerimento, ma ancora non funzionerà su alcune versioni di Safari. È meglio impostare semplicemente la funzione come: 'setTimeout (function() {adjust_for_font (id);}, 2000);' – SpYk3HH

3

Questo dovrebbe fare il trucco:

setTimeout(adjust_for_font, 2000, id); 

sto passando il nome della funzione, da eseguire quando 2000 millisecondi sono passati. Nel tuo codice, stai passando il risultato di adjust_for_font. Le parentesi dopo il nome della funzione causano l'esecuzione non appena viene analizzata (immediatamente).

+0

Non tutti i browser supportano la sintassi di 'setTimeout()' con un argomento per la funzione specificato dopo il ritardo. L'utilizzo di una funzione anonima come nelle altre risposte dovrebbe funzionare in tutti i browser. – nnnnnn

0

Questo è dalle mie esperienze. Basta specificare setTimeout() lo farà per eseguire su di pagina di carico stesso, anche se la sua funzione principale non viene chiamata. trasformandolo in una variabile come funziona ..

prima

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

dopo sintassi

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

Il SetTimeout è setTimeout (funzione, millisecondi, param1, param2, .. .)

qui "funzione" non significa che il chiamata di t ha funzione. Dovrebbe essere la vera funzione.

quindi bisogna modificare il codice per

setTimeout (adjust_for_font, 2000, id); (nota: Il parametro id dovrebbe passare dopo il parametro millisecondi)

o, in alternativa è possibile impostare il primo parametro come muggito

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

Problemi correlati