Ответ 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: если вы хотите практического решения, а не этого взлома, то, пожалуй, лучший способ пойти на это может помочь Ежи Завадский с использованием библиотеки для создания диалоговых окон подтверждения.