Trato de crear una función de JavaScript que, cuando el usuario hace clic en un botón, abre una nueva pestaña después de un pequeño período de tiempo, luego espera un segundo y la cierra.
Actualmente, mi código se ve así:
var btn = document.getElementById("myLink"); btn.onclick = function() { setTimeout(function() { var win = window.open( "http://www.stackoverflow.com", "The new Link") },500); setTimeout(function(){ win.close(); if (win.closed) { clearInterval(timer); winClosed(); alert("'The new Link' window closed !"); } }, 2500); } Pero la segunda función setTimeout no se ejecuta. Cuando elimino una de las dos funciones setTimeout , la otra funciona bien, pero necesito tener las dos en ejecución.
Editar: se cambiaron los valores de tiempo de espera para tener en cuenta el comentario de @ lk77.
Hay 2 problemas en su código.
win en el primer tiempo de espera, lo que significa que no estará disponible en el segundo tiempo de espera. Es posible que desee leer sobre el cierre y el alcance en javascript.1500 ms y el segundo 500 , lo que significa que el segundo tiempo de espera se dispara antes que el primero.Esto debería estar funcionando:
var btn = document.getElementById("myLink"); btn.onclick = function() { var win = null; // initialize here so it is available in both timeouts setTimeout(function() { win = window.open( // set the value here "http://www.stackoverflow.com", "The new Link") },500); // this should fire first setTimeout(function(){ win.close(); if (win.closed) { clearInterval(timer); winClosed(); alert("'The new Link' window closed !"); } }, 1500); // this should fire second }La segunda devolución de llamada de setTimout se ejecutará antes que la primera, como lo hizo usted. Una forma de resolver este problema es agregar el segundo setTimeout dentro del primero, así:
let btn = document.getElementById("myLink"); btn.onclick = function () { setTimeout(function () { let win = window.open("http://www.stackoverflow.com", "The new Link"); let timer = setTimeout(function () { win.close(); if (win.closed) { clearInterval(timer); //winClosed(); //alert("'The new Link' window closed !"); } }, 1000); }, 500); };