2012-09-13 8 views
6

Duplicar posibles:
setTimeout Internet Explorerparámetros IE consiguen indefinido cuando se utiliza en setTimeout

Me estoy perdiendo algo aquí o hay un problema de Internet Explorer al pasar parámetros de la función a un setTimeout llamando a la misma función?

Esto ejecutará siempre en Internet Explorer:

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

¿Hay una manera de solucionar ese problema?

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

+0

Esto me tomó una hora o dos para averiguar por qué mi variable ámbito externo w como 'indefinido'. ¡Internet Explorer es el peor! –

Respuesta

14

La explicación y la solución son in the MDN:

Si tiene que pasar un argumento a la función de devolución de llamada, pero necesita para trabajar en Internet Explorer, que no soporta el envío parámetros adicionales (ni con setTimeout() ni setInterval()) puede incluir este código de compatibilidad específica de IE que habilitará la funcionalidad de paso de parámetros estándar HTML5 de en ese navegador para ambos temporizadores simplemente insertándolo al principio de sus scripts.

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 parece funcionar con parámetros en IE10. Sin embargo, no encuentro nada que documente el soporte para la funcionalidad en IE10 +. MSDN aún indica que no es compatible: http://msdn.microsoft.com/library/ie/ms536753.aspx –

+1

@KevinBabcock El MDN es más preciso que MSDN al respecto: https://developer.mozilla.org/en/ docs/Web/API/window.setTimeout # Browser_compatibility –

7

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

Es necesario para envolver la función en una función que requiere argumentos:

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

    } 
} 

myFunction("something"); 
+0

Esto funcionó mejor para mí –

+0

no funcionará si los argumentos se cambian durante esos 50 ms – denns

Cuestiones relacionadas