2012-07-30 21 views
23

Zajmuję się tworzeniem aplikacji internetowych, które wykorzystują okna dialogowe JavaScript alert() i confirm().Jak wyłączyć "uniemożliwić tej stronie tworzenie dodatkowych okien dialogowych"?

Jak wyłączyć zaznaczanie tego pola wyboru przez Chrome?

Czy jest ustawienie można zmodyfikować?

Wiem, że mogłem zmodyfikować kod źródłowy, ale chciałbym, aby Chrome wciąż mógł automatycznie aktualizować.

Nie muszę się martwić o inne przeglądarki, ponieważ aplikacja działa tylko w przeglądarce Chrome.

Mam uprawnienia administratora do maszyn (Windows), które uruchamiają aplikację.

Odpowiedz

38

Nie możesz. Jest to funkcja przeglądarki, która zapobiega wyświetlaniu setek alertów w witrynach, aby zapobiec opuszczaniu witryny.

Możesz jednak zajrzeć do modalnych wyskakujących okienek, takich jak jQuery UI Dialog. Są to pola alertów javascript, które pokazują niestandardowe okno dialogowe. Nie używają domyślnej funkcji alert() i dlatego omijają problem, z którym się w całości korzystasz.

Zauważyłem, że aplikacje, które mają wiele skrzynek wiadomości i potwierdzeń, mają większą wygodę użytkowania, jeśli korzystasz z niestandardowych okien dialogowych zamiast domyślnych alertów i potwierdzeń.

+1

Nie chcę dodawać struktury, takiej jak jQuery. Ponadto w całym kodzie jest dużo pól 'alert()' i 'confirm()'. Nie chcę wymyślać koła, wystarczy wyłączyć to pole wyboru. –

+1

@ DannyBeckett są tam również czyste modemy JS. JS może być naprawdę minimalny, wystarczy pokazać/ukryć element div. Reszta to CSS. Możesz zastąpić domyślne funkcje alertów/potwierdzeń własnymi, więc nie musisz zmieniać kodu. – sachleen

+2

Nawiasem mówiąc, możesz z łatwością nadpisać istniejącą funkcję alertu, aby wszystkie wywołania funkcji 'alert()' używały niestandardowego podręcznika modalnego zamiast natywnego. http://stackoverflow.com/questions/1729501/javascript-overriding-alert – sachleen

-1

Powinieneś pozwolić użytkownikowi to zrobić, jeśli chcą (i nie możesz ich zatrzymać).

Twoim problemem jest to, że musisz wiedzieć, że mają, a następnie założyć, że mają na myśli OK, a nie anulować. Wymienić confirm(x) z myConfirm(x):

function myConfirm(message) { 
    var start = Number(new Date()); 
    var result = confirm(message); 
    var end = Number(new Date()); 
    return (end<(start+10)||result==true); 
} 
+0

To nie działa. Pole wyboru jest nadal wyświetlane: http://i.imgur.com/WRMeDHj.png - oto moje skrzypce: http://jsfiddle.net/x2N5E/ –

7

wiem, każdy jest etycznie wobec tego, ale rozumiem, istnieją powody praktyczne żarty gdzie jest to pożądane. Uważam, że Chrome zajął solidne stanowisko w tej sprawie, wymuszając obowiązkowy jeden sekundowy czas separacji między komunikatami alarmowymi. Daje to odwiedzającym czas na zamknięcie strony lub odświeżenie, jeśli utknęli na irytującej stronie dowcipów.

Więc, aby odpowiedzieć na twoje pytanie, wszystko zależy od czasu. Jeśli ostrzeżesz więcej niż raz na sekundę, Chrome utworzy to pole wyboru. Oto prosty przykład obejścia:

var countdown = 99; 
function annoy(){ 
    if(countdown>0){ 
     alert(countdown+" bottles of beer on the wall, "+countdown+" bottles of beer! Take one down, pass it around, "+(countdown-1)+" bottles of beer on the wall!"); 
     countdown--; 

     // Time must always be 1000 milliseconds, 999 or less causes the checkbox to appear 
     setTimeout(function(){ 
      annoy(); 
     }, 1000); 
    } 
} 

// Don't alert right away or Chrome will catch you 
setTimeout(function(){ 
    annoy(); 
}, 1000); 
+0

Skąd wiesz, że jest to sekunda, czy po prostu zgadujesz? – DeadlyChambers

+2

Wygląda na to, że mozilla używa 3-sekundowej rozpiętości. https://bugzilla.mozilla.org/show_bug.cgi?id=61098#c209 – DeadlyChambers

+0

Dzięki za informację, dobrze jest wiedzieć, że FF to 3 sekundy, przetestowałem ten kod tylko w Chrome. Odkryłem regułę 1-sekundową Chrome przez kilka krótkich testów, możesz sam sprawdzić, czy każdy interwał poniżej 1000 ms powoduje pojawienie się pola wyboru, więc nie jest to tylko coś, co wymyśliłem. Mogą bardzo dobrze to zmienić w przyszłości, ale na razie to dokładnie 1 sekunda. – CauselessEffect

8

To, co skończyło się robi, ponieważ mamy aplikację, która ma wielu użytkowników, które nie są pod naszą kontrolą ... (@ DannyBeckett Znam tego ISN” • dokładna odpowiedź na twoje pytanie, ale ci, którzy patrzą na twoje pytanie, mogą w tym pomóc.) Możesz przynajmniej wykryć, czy nie widzą okien dialogowych. Jest kilka rzeczy, które najprawdopodobniej chcesz zmienić, np. Czas wyświetlenia lub to, co faktycznie wyświetlasz. Pamiętaj, że powiadomi to tylko użytkownika, że ​​udało mu się kliknąć to małe pole wyboru.

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

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 confirms turned off"); 
    } 
    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

Jak to działa? – locateganesh

+0

@locateganesh To działa na zasadzie wysokiego jacking natywnego potwierdzenia i alertu. Wartość 350 to milisekunda, która sprawdza, ile czasu ma potwierdzenie/alert. Jeśli jest otwarty dłużej niż to zakłada się, że alarmy/potwierdzenia NIE są blokowane. "MySpecialDialog" to utworzone okno dialogowe, które nie wykorzystuje natywnego alertu/potwierdzeń przeglądarki. Więc jeśli masz moduł ładowania początkowego lub coś takiego, otworzy to i powiadomi użytkownika. – DeadlyChambers

3

Powinieneś lepiej używać jquery-confirm zamiast próbować usunąć to pole wyboru.

$.confirm({ 
    title: 'Confirm!', 
    content: 'Are you sure you want to refund invoice ?', 
    confirm: function(){ 
     //do something 
    }, 
    cancel: function(){ 
     //do something 
    } 
}); 
Powiązane problemy