Подтвердить что ты не робот

Как обнаружить "запретить этой странице создавать дополнительные диалоги"

Вопрос

Как определить, был ли пользователь установлен флажок, "запретить этой странице создавать дополнительные диалоги"?

ПОЧЕМУ Это проблема

Если пользователь предотвратил появление ящиков подтверждения, функция confirm('foobar') всегда возвращает false.

Если пользователь не может видеть мои диалоговые окна подтверждения confirm('Are you sure?'), пользователь никогда не сможет выполнить действие.

КОНТЕКСТ

Итак, я использую код как if(confirm('are you sure?')){ //stuff... }. Таким образом, автоответчик false из браузера не позволит пользователю делать stuff. Но если бы был способ обнаружить, что пользователь установил флажок, я могу выполнить действие автоматически.

Я думаю, что если пользователь отключил диалоги, функция должна либо выбросить ошибку, либо вернуть true. Функция предназначена для подтверждения действия, которое запросил пользователь.

4b9b3361

Ответ 1

Насколько я знаю, это невозможно сделать каким-либо чистым способом, поскольку это функция браузера, и если браузер не дает вам знать, то вы не можете знать.

Однако, что вы можете сделать, это написать обертку вокруг confirm(), которая увеличивает время отклика. Если это слишком быстро, чтобы быть человеком, запрос скорее всего был бы подавлен, и он вернул бы истину вместо ложной. Вы можете сделать его более надежным, запустив confirm() несколько раз, пока он возвращает false, поэтому вероятность того, что он является быстрым пользователем, очень низок.

Обертка будет выглядеть примерно так:

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;
}

PS: если вы хотите практического решения, а не этого взлома, то, пожалуй, лучший способ пойти на это может помочь Ежи Завадский с использованием библиотеки для создания диалоговых окон подтверждения.

Ответ 2

Я думаю, вы не можете его изменить - это функция браузера.

Моя первая идея, если вам нужно обходное решение, - это изменить код с помощью системы confirm на некоторое оповещение библиотеки js (например, jQuery UI)