Czy istnieje sposób używania JavaScript lub jQuery do wykrywania, czy wyświetlane jest pole potwierdzenia lub alertu?Wykrywanie, czy alert lub potwierdzenie jest wyświetlane na stronie
Odpowiedz
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.
+1 za fakt, że twój drugi akapit jest prawie na pewno prawdziwy. – Moses
@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
To jest to, co myślałem, dzięki za twoje odpowiedzi ludzie !! – Uggers2k
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.
To prawda, że blokują wątek interfejsu użytkownika, ale to nie znaczy, że można go wykryć. –
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.
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
- jesteś hacking metodę hosta przeglądarce (rzeczy nie należy zazwyczaj zrobić - http://perfectionkills.com/whats-wrong-with-extending-the-dom/)
- powinien po prostu być lepsze śledzenie swojego
alert()
confirm()
użytkowania, haha
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
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ń. –
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. –
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
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;
}
Co masz na myśli mówiąc "być wystawionym" dokładnie? Czy masz na myśli to, czy w kodzie jest odniesienie do polecenia? –
Dzięki pracownikom internetowym możesz ... –
@SimeVidas wyjaśnić, jak? – Raynos