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?
Odpowiedz
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
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();
Czy jest to również prawdą w macierzystym javascript .click()? – nbrooks
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
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
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.
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