Quiero obligar a los usuarios a permanecer en la pestaña nueva durante cierto tiempo antes de que se les permita cerrarla.

Aquí hay un ejemplo: https://foom.egybest.co/ cuando los usuarios cierran la ventana emergente rápidamente, se bloquea por completo sitio web y notifique a los usuarios que deshabiliten el bloqueo de anuncios.

<img  onclick="xxx()" src="https://icon-icons.com/icons2/1648/PNG/96/10094clownface_109962.png"  >


<script>
function xxx() {

var popUp = window.open('https://www.google.com/');

var timer = setInterval(function() {
    if(popUp.closed) {
        clearInterval(timer);
        alert('closed');
    }
}, 2000);

if (popUp == null || typeof(popUp)=='undefined') {  
    alert('AdBlock detect'); 
} 
else {  
    popUp.focus();
}
}


</script>
0
jowan 26 ago. 2020 a las 14:42

1 respuesta

La mejor respuesta

Si tuviera acceso a todos los enlaces en cuestión, podría agregar un postMessage para onbeforeunload.

De lo contrario, debe dividir la lógica de duración de la lógica de verificación. Una versión sería establecer el intervalo bajo para verificar con frecuencia y pasar el tiempo de inicio a la función de devolución de llamada, en la que se puede calcular el tiempo transcurrido.

Aquí hay un breve ejemplo:

function xxx(link){
  var tObject = {
    popUp: window.open(link),
    startTime: Date.now(),
    requiredWaitingTimeInMS: 2000,
    Timer: null
  };

  //REM: No popup found
  if(!tObject.popUp){  
    alert('No popup detect')
  } 
  else{
    tObject.popUp.focus();
    tObject.Timer = setInterval(function(object){
      if(object){
        //REM: If there is no popup or the popup is closed, we are done
        if(!object.popUp || object.popUp.closed){
          //REM: Stopping timer and cleanup
          clearInterval(object.Timer);
          object = null;

          //REM: Output on fail
          alert('Not enough time')
        }
        //REM: Else if the popup is open and the waiting time passes 2000ms, we are done
        else if(
          Date.now() - object.startTime > object.requiredWaitingTimeInMS
        ){
          //REM: Stopping timer and cleanup
          clearInterval(object.Timer);
          object = null;

          //REM: Output on success
          alert('Enough time')
        }
      }
    }.bind(this, tObject), 50)
  }
}
<img  onclick="xxx(this.src)" src="https://icon-icons.com/icons2/1648/PNG/96/10094clownface_109962.png" >
1
Lain 26 ago. 2020 a las 13:58