2012-01-13 13 views
5

Próbuję zrozumieć zachowanie Firefoksa dotyczące dodanego "uniemożliwienia tej stronie tworzenia dodatkowych okien dialogowych" w oknach dialogowych.zasady dla "uniemożliwienia tej stronie tworzenia dodatkowych okien dialogowych"

jQuery, jeśli dodam następujące detektory:

//html 
<input class="testInput" /> 

//javascript 
$('.testInput') 
.click(function(){ alert('clicked') }) 
.keyup(function(){ alert('keyup') }) 
  1. Po kliknięciu na wejściu pojawi się okno alertu normalnie, aż do 13 czasu ~.
  2. Po naciśnięciu klawisza z drugiej strony wyświetlane jest już drugie okno komunikatu o numerze z komunikatem "uniemożliwić tworzenie dodatkowych okien dialogowych ". Właściwie wydaje się, że jest trochę tiemout, a jeśli poczekam jak 2 sekundy między dwoma naciśnięciami klawiszy, komunikat zniknie.

Z moich nieoficjalnych testów 2. faktycznie dotyczy, gdy okno alertu nie jest wywoływana z poziomu zwrotnego onclick (np keyup zwrotna, wyświetlając okno ostrzeżenia w odpowiedzi na skargi ajax ...)

Używam Firefoksa 9.0.1 pod Ubuntu, o ile wiem, że nie zmodyfikowałem ustawień Firefoxa odnośnie do tych progów. Wyobrażam sobie, że dzieje się tak z każdą najnowszą wersją dowolnej przeglądarki.

Używam biblioteki jQuery, ale nie sądzę, że ma to znaczenie tutaj.

Moje pytanie brzmi: Jakie są dokładne reguły, które sprawiają, że to ostrzeżenie pojawia się w oknie dialogowym?

[Edytuj]

Korzystanie Chromium/Ubuntu (wersja 17.0.963.26), próg wydaje się być tylko opóźnienie pomiędzy dwoma oknami dialogowymi.

Można to sprawdzić z jsfiddle here (thx Rory McCrossan)

+1

FYI: testowanie z tym skrzypce (http: // jsfiddle.net/RoryMcCrossan/9XwTn/) Dostaję checkbox w alarmie w 12. iteracji dla kliknięcia i keyup. –

+0

@Rory: Nadal mam moje zachowanie. Jaką masz przeglądarkę? thx dla łącza jsfiddle. – LeGEC

+0

Wystarczy wpisać więcej danych; Dostaję go w iteracji dwunastego kliknięcia i drugiej iteracji przy FF 9.0.1 Windows XP SP3. –

Odpowiedz

5

Dokładna reguła (reguły): odstęp czasowy między wyskakującymi oknami dialogowymi. Wartość używana do określenia, to jest w SUCCESSIVE_DIALOG_TIME_LIMIT

odjazdu linii 2614 w linku poniżej fragmencie:

nsGlobalWindow::DialogOpenAttempted() 

TimeDuration dialogDuration(TimeStamp::Now() - topWindow->mLastDialogQuitTime); 

if (dialogDuration.ToSeconds() < Preferences::GetInt("dom.successive_dialog_time_limit",SUCCESSIVE_DIALOG_TIME_LIMIT)){topWindow->mDialogAbuseCount++;return (topWindow->GetPopupControlState() > openAllowed || topWindow->mDialogAbuseCount > MAX_DIALOG_COUNT);}topWindow->mDialogAbuseCount = 0; return false;} 

Link to source

+0

I ** jaka jest ta wartość **? –

1

Można kopać wokół źródła Firefox, jeśli chcesz. Pamiętaj, że różne przeglądarki będą miały różne reguły.

Odpowiedni kod dla przeglądarki Firefox to nsGlobalWindow.cpp i nsGlobalWindow.h (poniższe linki odnoszą się do numerów linii, a więc będą powoli gnić wraz ze zmianą źródła). Wydaje się być kontrolowany przez stałe MAX_DIALOG_COUNT (10) w nsGlobalWindow.h i SUCCESSIVE_DIALOG_TIME_LIMIT (3, jednostki to sekundy). nsGlobalWindow.cpp utrzymuje liczbę (mDialogAbuseCount). Wygląda na to, że funkcja dialogDuration zwiększa lub usuwa wartość mDialogAbuseCount w zależności od tego, czy okno dialogowe zostało otwarte dłużej niż SUCCESSIVE_DIALOG_TIME_LIMIT. Funkcja AreDialogsBlocked używa mDialogAbuseCount (w części), aby zdecydować, czy są zablokowane.

Krótko mówiąc: jeśli wielokrotnie otwierasz wyskakujące okienka, a następnie je zamykasz w ciągu trzech sekund, po około 10 sekundach uruchomisz coś.

Powiązane problemy