2012-09-13 38 views
6

thể trùng lặp:
setTimeout Internet Explorerthông số IE được xác định khi sử dụng chúng trong setTimeout

Tôi có thiếu cái gì ở đây hay là có một vấn đề trong Internet Explorer khi đi qua các thông số chức năng để một setTimeout gọi cùng một chức năng?

này sẽ chạy mãi trong Internet Explorer:

function myFunction(myParam, tries){ 
    if (typeof tries == "undefined"){ 
    tries = 0; 
    } 
    tries++; 
    if (tries < 2){ 
    setTimeout(myFunction, 50, myParam, tries); 
    } 
} 
myFunction("something"); 

Có cách nào để làm việc xung quanh vấn đề này?

http://fiddle.jshell.net/rH3gx/

+0

này đã cho tôi một hay hai giờ để tìm ra lý do tại sao biến phạm vi bên ngoài của tôi như 'undefined'. Internet Explorer là tồi tệ nhất! –

Trả lời

14

Lời giải thích và giải pháp là in the MDN:

Nếu bạn cần phải vượt qua một đối số cho hàm callback của bạn, nhưng nó cần để làm việc trong Internet Explorer, mà không hỗ trợ gửi tham số bổ sung (không với setTimeout() hoặc setInterval()), bạn có thể bao gồm mã tương thích với IE cụ thể này sẽ bật chức năng thông số tiêu chuẩn HTML5 trong trình duyệt đó cho cả hai tính giờ chỉ bằng cách chèn nó vào đầu tập lệnh của bạn.

if (document.all && !window.setTimeout.isPolyfill) { 
    var __nativeST__ = window.setTimeout; 
    window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { 
    var aArgs = Array.prototype.slice.call(arguments, 2); 
    return __nativeST__(vCallback instanceof Function ? function() { 
     vCallback.apply(null, aArgs); 
    } : vCallback, nDelay); 
    }; 
    window.setTimeout.isPolyfill = true; 
} 

if (document.all && !window.setInterval.isPolyfill) { 
    var __nativeSI__ = window.setInterval; 
    window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) { 
    var aArgs = Array.prototype.slice.call(arguments, 2); 
    return __nativeSI__(vCallback instanceof Function ? function() { 
     vCallback.apply(null, aArgs); 
    } : vCallback, nDelay); 
    }; 
    window.setInterval.isPolyfill = true; 
} 
+0

setTimeout xuất hiện để làm việc với các tham số trong IE10. Tuy nhiên, tôi không thể tìm thấy bất cứ điều gì tài liệu hỗ trợ cho các chức năng trong IE10 +. MSDN vẫn chỉ ra rằng nó không được hỗ trợ: http://msdn.microsoft.com/library/ie/ms536753.aspx –

+1

@KevinBabcock MDN chính xác hơn MSDN về điều này: https://developer.mozilla.org/en/ docs/Web/API/window.setTimeout # Browser_compatibility –

7

http://fiddle.jshell.net/rH3gx/2/

Bạn cần phải quấn chức năng trong một chức năng mà không cần đối số:

function myFunction(myParam, tries){ 
    if (typeof tries == "undefined"){ 
    tries = 0; 
    } 
    tries++; 
    if (tries < 2){ 
    setTimeout(function() { 
     myFunction(myParam, tries); 
    }, 50); 

    } 
} 

myFunction("something"); 
+0

Điều này phù hợp nhất với tôi –

+0

sẽ không hoạt động nếu các đối số được thay đổi trong 50ms đó – denns