2012-02-07 46 views
11

Ai đó có thể cho tôi biết lý do tại sao setTimeout được sử dụng trong mã bên dưới không hoạt động? Nó chỉ chạy hàm ngay lập tức.SetTimeout không trì hoãn cuộc gọi hàm

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

Mọi trợ giúp đều được đánh giá cao.

+4

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

+0

Cảm ơn Sim của bạn một ngôi sao! Tôi vẫn quen với javascript - và nó hiển thị vào những lúc! Cảm ơn một lần nữa. –

Trả lời

2

Cách bạn viết, nó giống như đầu ra của adjust_for_font(id) là đầu vào cho tham số đầu tiên là setTimeout. Tham số đầu tiên phải là hàm, không phải là kết quả của hàm. Hãy thử điều này thay vì ...

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

Vấn đề là dòng này

setTimeout(adjust_for_font(id),2000); 

này không lịch sự cách gọi của adjust_for_font(id) nhưng thay vì gọi hàm trực tiếp và lịch trình các giá trị trả về. Để lập kế hoạch invocation của hàm quấn cuộc gọi trong một lambda

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

Cảm ơn vì điều này. –

+0

Đây chính xác là những gì tôi cần, cảm ơn! – RichieMN

5

Bằng không đặt dấu ngoặc kép quanh chức năng của bạn, chức năng sẽ xử lý ngay lập tức, setTimeout sẽ chạy (nhưng sẽ không xử lý một chức năng) và bạn trái tự hỏi những gì trên trái đất đã xảy ra.

setTimeout được thiết kế để chạy như thế này:

setTimeout('adjust_for_font',2000); 

Hoặc một cách sử dụng một chức năng ẩn danh trong khi gọi lại là một tùy chọn:

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

'... trái tự hỏi những gì trên trái đất đã xảy ra' - yep rằng về tổng hợp lập trình javascript của tôi tại thời điểm này !! –

3

Thay đổi

setTimeout(adjust_for_font(id),2000); 

để

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

Không phải là một gợi ý xấu nhưng vẫn không hoạt động trên một số phiên bản safari nhất định. Tốt nhất bạn chỉ cần đặt nó vào trong hàm là: 'setTimeout (function() {adjust_for_font (id);}, 2000);' – SpYk3HH

3

này nên làm như lừa:

setTimeout(adjust_for_font, 2000, id); 

tôi đi qua tên hàm, để được thực thi khi 2000 mili giây đã trôi qua. Trong mã của bạn, bạn đang chuyển kết quả của adjustment_for_font. Các dấu ngoặc sau tên hàm khiến cho nó được thực thi ngay khi nó được phân tích cú pháp (ngay lập tức).

+0

Không phải tất cả các trình duyệt đều hỗ trợ cú pháp 'setTimeout()' với đối số cho hàm được chỉ định sau khi trì hoãn. Sử dụng một hàm ẩn danh như trong các câu trả lời khác sẽ hoạt động trong tất cả các trình duyệt. – nnnnnn

0

Đây là từ kinh nghiệm của tôi. Chỉ cần chỉ định setTimeout() sẽ làm cho nó thực thi khi tải trang, ngay cả khi chức năng cha mẹ không được gọi. làm cho nó vào một biến như làm việc này ..

trước

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

sau cú pháp

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

setTimeout là setTimeout (function, mili giây, param1, param2, .. .)

Ở đây "chức năng" có nghĩa là không phải là gọi của t anh ta hoạt động. Nó phải là chức năng thực sự.

Vì vậy, bạn phải thay đổi mã của mình thành

setTimeout (adjust_for_font, 2000, id); (lưu ý: Các tham số id phải vượt qua sau khi thông số mili giây)

hoặc cách khác bạn có thể thiết lập các tham số đầu tiên là dưới

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

Các vấn đề liên quan