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.
- 1. kliknięcie kliknięcia CellTable
- 2. Jaki jest dobry sposób programowego sterowania akordeonem kątowym?
- 3. Rozróżnianie kliknięcia myszą i kliknięcia myszą w wpf
- 4. W jaki sposób obsługiwać zdarzenia kliknięcia wewnątrz wtyczki jQuery?
- 5. W jQuery, jak mogę odróżnić kliknięcie programowe od użytkownika?
- 6. Przeglądarka Androida ZIELONA ramka na kliknięcie
- 7. Sposób programowego tworzenia wiązań layoutu
- 8. W jaki sposób przeglądarka wykonuje odpowiedź AJAX w szynach?
- 9. W jaki sposób przeglądarka decyduje, które pola formularza są nazwą użytkownika/hasłem?
- 10. w ASP.NET, co odróżnia Request.IsAuthenticated = true
- 11. Przeglądarka czasami ignoruje zdarzenie kliknięcia jQuery podczas transformacji CSS3
- 12. W jaki sposób GitHub wykrywa, czy przeglądarka obsługuje kolory emoji?
- 13. Najlepszy sposób programowego wykrywania sprzętu iPad/iPhone
- 14. RequiredFieldValidator wymaga dwukrotnego kliknięcia przez użytkownika
- 15. W jaki sposób można klikać linki do kliknięcia EditText?
- 16. Jak przechwycić kliknięcie łącza w TextView?
- 17. Czy istnieje sposób na usunięcie opóźnienia kliknięcia na urządzeniach mobilnych?
- 18. Najczystsze jedno kliknięcie + obsługa dwukrotnego kliknięcia w Silverlight?
- 19. Sposób programowego dodawania grupy do szuflady nawigacji
- 20. jaki sposób przeglądarka generuje klucz symetryczny podczas SSL handshake
- 21. Sposób programowego dostępu do czcionki systemowej iOS
- 22. W jaki sposób weryfikować unikatową wiadomość e-mail od użytkownika, który aktualizuje ją w Laravel?
- 23. Jak zidentyfikować kliknięcie użytkownika z "ekranu głównego" iPhone'a?
- 24. Datacicker jQuery UI - próba przechwytywania zdarzenia kliknięcia od daty kliknięcia
- 25. W jaki sposób podajesz bieżące zmienne środowiska użytkownika?
- 26. Wywoływanie zdarzenia "kliknięcie" bez wprowadzenia użytkownika
- 27. Jaki jest najlepszy sposób uzyskania danych wejściowych od użytkownika w C?
- 28. Uruchom altankę od użytkownika root, jest to możliwe? W jaki sposób?
- 29. Kliknięcie w formularzu C#
- 30. Czy istnieje sposób programowego ustawiania parametrów kontekstowych w osadzonym pomoście?
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