Cómo detectar "evitar que esta página cree cuadros de diálogo adicionales"

Resuelto hrdwdmrbl asked hace 12 años • 2 respuestas

PREGUNTA

¿Cómo puedo detectar si un usuario ha marcado la casilla "evitar que esta página cree cuadros de diálogo adicionales"?

POR QUÉ es un problema

Si el usuario ha impedido la aparición de cuadros de confirmación, la función confirm('foobar')siempre devuelve falso.

Si el usuario no puede ver mis cuadros de diálogo de confirmación confirm('Are you sure?'), entonces el usuario nunca podrá realizar la acción.

CONTEXTO

Entonces, uso el código como if(confirm('are you sure?')){ //stuff... }. Por lo tanto, una respuesta automática del falsenavegador impedirá que el usuario lo haga stuff. Pero, si hubiera una manera de detectar que el usuario ha marcado la casilla, entonces podría ejecutar la acción automáticamente.

Creo que si el usuario ha desactivado los diálogos, entonces la función debería arrojar un error o devolver verdadero. La función está destinada a confirmar una acción que el usuario ha solicitado.

hrdwdmrbl avatar Jul 20 '12 06:07 hrdwdmrbl
Aceptado

Hasta donde yo sé, esto no es posible hacerlo de ninguna manera limpia, ya que es una función del navegador, y si el navegador no te lo permite saber, entonces no puedes saberlo.

Sin embargo, lo que podría hacer es escribir un contenedor alrededor de confirm() que multiplique el tiempo de respuesta. Si es demasiado rápido para ser humano, es muy probable que el mensaje haya sido suprimido y devolverá verdadero en lugar de falso. Podría hacerlo más robusto ejecutando confirm() varias veces siempre que devuelva falso, por lo que la probabilidad de que sea un usuario súper rápido sea muy baja.

El envoltorio sería algo como esto:

function myConfirm(message){
    var start = new Date().getTime();
    var result = confirm(message);
    var dt = new Date().getTime() - start;
    // dt < 50ms means probable computer
    // the quickest I could get while expecting the popup was 100ms
    // slowest I got from computer suppression was 20ms
    for(var i=0; i < 10 && !result && dt < 50; i++){
        start = new Date().getTime();
        result = confirm(message);
        dt = new Date().getTime() - start;
    }
    if(dt < 50)
       return true;
    return result;
}

PD: si desea una solución práctica y no este truco, la sugerencia de Jerzy Zawadzki de usar una biblioteca para crear cuadros de diálogo de confirmación es probablemente la mejor manera de hacerlo.

entropy avatar Jul 20 '2012 00:07 entropy

Creo que no puedes cambiarlo: es una función del navegador.

Mi primera idea si necesita una solución alternativa sería cambiar el código de uso del sistema confirma alguna alerta de biblioteca js (por ejemplo, desde jQuery UI)

Jerzy Zawadzki avatar Jul 20 '2012 00:07 Jerzy Zawadzki