2011-02-01 24 views

Odpowiedz

5

Nie, nie ma. Możesz sprawdzić, czy zwracana wartość polecenia confirm jest rzeczywiście true lub false, ale nie możesz sprawdzić, czy tam jest to widoczne.

Te rzeczy są częścią przeglądarki, która nie należy do DOM. Jestem pewien, że istnieje brudny hack, który działa dla IE, ponieważ jest to spasane dziecko systemu operacyjnego Windows.

+4

+1 za fakt, że twój drugi akapit jest prawie na pewno prawdziwy. – Moses

+0

@Moses Rzucam Ci wyzwanie, aby znaleźć link do systemu operacyjnego Windows, który pozwala na sprawdzenie, czy alert jest fizycznie wyświetlany w IE – Raynos

+0

To jest to, co myślałem, dzięki za twoje odpowiedzi ludzie !! – Uggers2k

1

Pola potwierdzenia i alarmujące blokują zdarzenia - wykonanie kodu JavaScript jest zatrzymane, gdy są one wyświetlane. Więc nie - nie możesz wykryć, czy ktoś jest aktualnie wyświetlany, o ile wiem.

+0

To prawda, że ​​blokują wątek interfejsu użytkownika, ale to nie znaczy, że można go wykryć. –

16

Jeśli chciał uruchomić trochę kodu, jeśli alert() pożary, można spróbować czegoś takiego:

Przetestowałem tylko w Chrome, więc nie jestem pewien o wsparcie przeglądarki.

Przykład:http://jsfiddle.net/Q785x/1/

(function() { 
    var _old_alert = window.alert; 
    window.alert = function() { 
        // run some code when the alert pops up 
     document.body.innerHTML += "<br>alerting"; 
     _old_alert.apply(window,arguments); 
        // run some code after the alert 
     document.body.innerHTML += "<br>done alerting<br>"; 
    }; 
})(); 

alert('hey'); 
alert('you'); 
alert('there'); 

Oczywiście to tylko pozwala na uruchamianie kodu przed i po dokonaniu wpisu. Jak zauważył @kander, wykonywanie javascript zostało zatrzymane, gdy wyświetlany jest alert.

+0

To też jest fajne. –

+0

Słodkie rozwiązanie! +1. – kander

+0

nie masz gwarancji, że alert zostanie uruchomiony. Twoje założenie, że window.alert jest poprawnie zaimplementowany! – Raynos

2

Można to zrobić, jeśli chcesz ...

(function() { 

    // remember the normal alert 
    var oldAlert = (function(){ return this.alert; }()), 
     oldConfirm = (function(){ return this.confirm; }()); 

    // inject ourself into the window.alert and window.confirm globals 
    alert = function (msg) { 
     oldAlert.call(document, msg); 
     document.onAlert(msg); 
    }; 
    confirm = function (msg) { 
     var result = oldConfirm.call(document, msg); 
     document.onConfirm(msg, result); 
     return result; 
    }; 

    // these just chill and listen for events 
    document.onAlert = function (msg) { 
     window.console && console.log('someone alerted: ' + msg); 
    }; 
    document.onConfirm = function (msg) { 
     window.console && console.log('someone was asked: ' + msg); 
     window.console && console.log('and they answered: ' + (msg ? 'yes' : 'no')); 
    }; 

}()); 

Minusem jest to, że

2

Jeśli chcesz wykryć, czy są one blokowane. Będziesz musiał zrobić to samo z wiadomością, którą będziesz przesyłać, ale zastąpić natywny alert/potwierdzić.

window.nativeAlert = window.alert; 
window.alert = function (message) { 
var timeBefore = new Date(); 
var confirmBool = nativeAlert(message); 
var timeAfter = new Date(); 
if ((timeAfter - timeBefore) < 350) { 
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!"); 
    } 
} 

window.nativeConfirm = window.confirm; 
window.confirm = function (message) { 
var timeBefore = new Date(); 
var confirmBool = nativeConfirm(message); 
var timeAfter = new Date(); 
if ((timeAfter - timeBefore) < 350) { 
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!"); 
} 
return confirmBool; 
} 

Oczywiście ustawiłem czas na 3,5 milisekundy. Ale po kilku testach mogliśmy tylko kliknąć lub zamknąć okna dialogowe w około 5 milisekund plus

+0

W opcji confirm() można również zwrócić wartość null, jeśli przedział czasowy jest zbyt krótki; może to być wykryte zarówno przez osoby dzwoniące, jak i wyglądające na "fałszywe" dla większości normalnych zastosowań. –

+0

Zastąpienie powrotu do wartości null (lub fałszu) w zbyt krótkim czasie może również pomóc w zapobieganiu przypadkowemu automatycznemu potwierdzeniu, gdy ktoś przesyła formularz, ale zbyt długo przytrzymuje klawisz Enter. –

+0

To nie jest zły pomysł, ale martwię się, że decyzja użytkownika jest nadrzędna, może się zdarzyć, że wiedzą, że będzie potwierdzenie. Chociaż widzę korzyść z tego, ponieważ jest to jedyna luka w tym zakresie. Ktoś, kto może przytrzymać enter, uruchomi specjalne okno dialogowe. Ale będzie działać przez 99,9% czasu. – DeadlyChambers

1

Aby dodać do @ user113716, możesz polegać na czasie. Zakładam, że jeśli dialog potwierdzenia trwał mniej niż 200 ms, jest on blokowany przez przeglądarkę. Poniżej zwracam true, jeśli dialog potwierdzenia jest zablokowany (domyślnie zwraca wartość false, kod jest w TypeScript).

let oldConfirm = window.confirm; 
    window.confirm = (msg) => { 
     let time = new Date().getTime(); 
     let conf = oldConfirm(msg); 

     return new Date().getTime() - time > 200 ? conf : true; 
    }