Il semble que la capacité a été ajouté à certains navigateurs passer des paramètres à setTimeout:
Syntaxe:setTimeout (function (p1,p2) {},1000,p1,p2);
(ajouter autant de params que vous voulez)
Si vous voulez vous assurer qu'il fonctionne partout, vous pouvez utiliser le code joint.
Note: Si vous souhaitez définir un délai d'attente immédiatement après l'avoir installé, il est préférable d'utiliser le paramètre de rappel et de le faire là-dedans
par exemple
installSwizzledTimeout(function(param1,param2){
setTimeout(myFunc,200,param1,param2);},param1,param2);
}
En effet, il utilise une astuce pour détecter si cela est nécessaire, en définissant un délai d'attente très court et en comptant les paramètres.
window.swizzledSetTimeout = function (fn, ms) {
if (arguments.length === 2) {
//console.log("Bypassing swizzledSetTimeout");
return window.originalSetTimeout(fn, ms);
} else {
var args = [];
for (i = 2; i < arguments.length; i++) {
args.push(arguments[i])
};
//console.log("Setting swizzledSetTimeout for function (",args,") {...} in ",ms," msec");
var retval = window.originalSetTimeout(function() {
//console.log("Invoking swizzledSetTimeout for function (",args,") {...}");
fn.apply(null, args);
}, ms);
return retval;
}
}
function installSwizzledTimeout(cb) {
var args = [];
for (i = 1; i < arguments.length; i++) {
args.push(arguments[i])
};
setTimeout(function (arg) {
//console.log("arguments.length:",arguments.length,window.setTimeout.toString());
if (arguments.length == 0) {
function doInstall() {
//console.log("Installing new setTimeout");
window.originalSetTimeout = window.setTimeout;
window.setTimeout = function setTimeout() {
return window.swizzledSetTimeout.apply(null, arguments);
};
if (cb) {
cb.apply(null, args);
};
}
if (window.setTimeout.toString().indexOf("swizzledSetTimeout") < 0) {
doInstall();
}
} else {
//console.log("existing set time supports arguments ");
if (cb) {
cb.apply(null, args);
};
}
}, 0, 1, 2, 3, 4);
}
Il convient de noter que la valeur passée à 'makeTimeout' sera la valeur de' sp.name' lorsque la fonction est appelée, ce qui pourrait être différente de la valeur qu'il avait quand 'setTImeout' a été appelé. – RobG
Selon http://kangax.github.io/es5-compat-table/#Function.prototype.bind, bind est désormais pris en charge par les principaux navigateurs. –
Comme RobG l'a dit, pour que cette chose fonctionne à 100%, vous devez utiliser une fermeture https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures Au moment où le délai expire, la valeur 'sp.name' peut avoir changé. – ikromm