2012-09-13 10 views
6

Powiel możliwe:
setTimeout Internet Explorerparametry IE dostać niezdefiniowane podczas używania ich w setTimeout

Am I brakuje czegoś tutaj lub jest jakiś problem w programie Internet Explorer podczas przekazywania parametrów funkcji w setTimeout wywołanie tej samej funkcji?

Będzie to działać zawsze w programie Internet Explorer:

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

Czy istnieje sposób, aby obejść ten problem?

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

+0

to zajęło mi godzinę lub dwie, aby dowiedzieć się, dlaczego moja zewnętrzna zmienna zasięgu w jako "niezdefiniowany". Internet Explorer jest najgorszy! –

Odpowiedz

14

Wyjaśnienie i rozwiązanie są in the MDN:

Jeśli trzeba przekazać argument do funkcji zwrotnej, ale trzeba to pracować w programie Internet Explorer, która nie obsługuje wysyłania dodatkowe parametry (ani za pomocą setTimeout() ani setInterval()) można ustawić jako ten specyficzny dla IE kod kompatybilności, który umożliwi standardową funkcję przechodzenia parametrów HTML5 w tej przeglądarce na oba timery po prostu wstawiając je na początku skryptów.

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 wydaje się działać z parametrami w IE10. Jednak nie mogę znaleźć niczego, co udokumentowałoby wsparcie dla funkcjonalności w IE10 +. MSDN wciąż wskazuje, że jest on nieobsługiwany: http://msdn.microsoft.com/library/ie/ms536753.aspx –

+1

@KevinBabcock MDN jest dokładniejszy niż MSDN na ten temat: https://developer.mozilla.org/en/ docs/Web/API/window.setTimeout # Kompatybilność przeglądarki –

7

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

Trzeba owinąć funkcję w funkcji, która wymaga żadnych argumentów:

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

    } 
} 

myFunction("something"); 
+0

To zadziałało najlepiej –

+0

nie zadziała, jeśli argumenty zostaną zmienione podczas tych 50ms – denns

Powiązane problemy