2012-06-19 7 views
15

Jeśli zainicjuję kliknięcie z jquery, które ma window.open(), jest ono blokowane przez blokadę wyskakujących okienek. Jeśli kliknę ręcznie, okno nie jest blokowane. Czym różni się przeglądarka?W jaki sposób przeglądarka odróżnia kliknięcie użytkownika od kliknięcia programowego?

+1

Oto [jsfiddle] (http://jsfiddle.net/twMSG/1/) do demonstracji. Spowoduje to wyskakowanie okienka na stronie, ale zostanie zablokowana. Wywołanie zdarzenia "kliknięcie" programowo powoduje, że jest on blokowany, ale jeśli wywołujemy go w ramach innego zdarzenia kliknięcia, następuje jego przejście. – sachleen

Odpowiedz

6

Realizacja Firefox to omówiono obszernie na this bug i this other bug ma jakieś dalsze ciekawe tło, w tym jakie strony długości przejdzie aby narzucić niechciane okienko na niczego nie podejrzewających użytkowników (w tym przypadku: wywołanie window.open() od w zdarzeniu load). Jeśli przeszukasz Bugzillę, przekonasz się, że ludzie z Mozilli zajęli kilka lat, aby wszystko działało poprawnie, na przykład here's a bug from 2001.

Jak to działa obecnie jest taka: Kiedy Firefox odbiera zdarzenie click z systemu operacyjnego, przez pewien okres czasu window.open() jest włączony JavaScript (poszukaj dom.disable_open_click_delay w about:config). Jeśli wywołasz zdarzenie click() z kodu bez kliknięcia użytkownika, a następnie pierwszego kroku, włączanie window.open() nigdy nie nastąpi, chociaż wywołanie window.open() samo się powiedzie to stop sites detecting that you have popup blocking enabled.

Nie jestem pewien, w jaki sposób inne przeglądarki implementują te rzeczy, ale byłbym zaskoczony, gdyby było inaczej

1

Wierzę, że wywołanie click za pośrednictwem jQuery tak naprawdę nie powoduje kliknięcia elementu, a zamiast tego wywołuje funkcję nasłuchującą kliknięcia. Tak więc, mimo że dzwonisz pod numer click(), właśnie wywołujesz funkcję.

Gdy użytkownik kliknie, jest to prawdziwe kliknięcie.

Przykład:

var handler = function() { 
    alert('hi'); 
}; 

$('#example').on('click', handler); 
$('#example').click(); // really just calls handler(); 
+0

Czy jest to również prawdą w macierzystym javascript .click()? – nbrooks

+1

Interesujące rzeczy do zapamiętania: jeśli Ty, jako użytkownik, robisz wszystko, co skutkuje wykonaniem kodu kliknięcia, nadal tak jest. Obejmuje to kliknięcie czegoś, co wywołuje zdarzenie typu "kliknij". Lub nawet kluczowe wydarzenie prasowe może zadzwonić i zadziała. – sachleen

+0

Trudno jest przewidzieć, w jaki sposób przeglądarka implementuje tę kontrolę, ponieważ nie ma nic w specyfikacji, aby dyktować, kiedy użytkownik powinien zostać poproszony. http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 – Fenton

0

natywny kod przeglądarki obsługuje rzeczywiste zdarzenie click mysz (od systemu operacyjnego) i tworzy obiekt zdarzenia przeglądarki. W tym momencie w natywnym kodzie przeglądarki przeglądarka wie, że to zdarzenie zostało utworzone przez prawdziwe kliknięcie myszą.

Domyślam się, że istnieje kilka ukrytych danych (niedostępnych z javascript) dołączonych do zdarzenia, które pozwalają przeglądarce śledzić, czy zdarzenie zostało zainicjowane za pomocą kliknięcia myszy, czy nie, chociaż mogą istnieć inne mechanizmy implementacji także.

Powiązane problemy