Mam zegar w moim JavaScript, który musi emulować kliknięcie linku, aby przejść do innej strony po upływie czasu. Aby to zrobić, używam funkcji jQuery click()
. Użyłem $().trigger()
i window.location
również i mogę sprawić, że będzie działać zgodnie z przeznaczeniem ze wszystkimi trzema.
Zauważyłem dziwne zachowanie click()
i próbuję zrozumieć, co się dzieje i dlaczego.
Używam Firefoksa do wszystkiego, co opisuję w tym pytaniu, ale interesuje mnie również, co inne przeglądarki będą z tym robić.
Jeśli nie użyłem $('a').bind('click',fn)
ani $('a').click(fn)
nie ustawiłem programu obsługi zdarzeń, wywołanie $('a').click()
wydaje się nic nie robić. Nie wywołuje domyślnej procedury obsługi przeglądarki dla tego zdarzenia, ponieważ przeglądarka nie ładuje nowej strony.
Jeśli jednak najpierw ustawię procedurę obsługi zdarzeń, będzie działać zgodnie z oczekiwaniami, nawet jeśli program obsługi zdarzeń nic nie robi.
$('a').click(function(){return true;}).click();
Spowoduje to załadowanie nowej strony, tak jakbym sam kliknął przycisk a.
Moje pytanie jest więc dwojakie: czy to dziwne zachowanie, ponieważ gdzieś robię coś złego? i dlaczego wywołanie click()
nic nie robi z zachowaniem domyślnym, jeśli nie utworzyłem własnego modułu obsługi?
EDYTOWAĆ:
Jak ustalił Hoffman, próbując powielić moje wyniki, wynik, który opisałem powyżej, w rzeczywistości nie ma miejsca. Nie jestem pewien, co spowodowało wydarzenia, które wczoraj obserwowałem, ale dziś jestem pewien, że nie to opisałem w pytaniu.
Odpowiedź jest taka, że nie można „udawać” kliknięć w przeglądarce i że wszystko, co robi jQuery, to wywoływanie modułu obsługi zdarzeń. Nadal możesz window.location
zmienić stronę, a dla mnie to działa dobrze.
Odpowiedzi:
Co ciekawe, jest to prawdopodobnie „prośba o funkcję” (tj. Błąd) dla jQuery. Zdarzenie jQuery click wyzwala akcję click (nazywaną zdarzeniem onClick w DOM) na elemencie tylko wtedy, gdy powiążesz zdarzenie jQuery z elementem. Powinieneś przejść do list mailingowych jQuery ( http://forum.jquery.com/ ) i zgłosić to. To może być pożądane zachowanie, ale nie sądzę.
EDYTOWAĆ:
Przeprowadziłem kilka testów i to, co powiedziałeś, jest błędne, nawet jeśli powiążesz funkcję ze znacznikiem „a”, nadal nie przeniesie Cię to do witryny określonej przez atrybut href. Wypróbuj następujący kod:
Nigdy nie trafia do google.com, chyba że klikniesz bezpośrednio link (z komentowanym kodem lub bez niego). Zauważ również, że nawet jeśli powiążesz zdarzenie kliknięcia z linkiem, nadal nie zmieni się ono na fioletowe po kliknięciu przycisku. Kolor zmienia się na fioletowy tylko po bezpośrednim kliknięciu linku.
Zrobiłem kilka badań i wydaje się, że .click nie powinien działać z tagami „a”, ponieważ przeglądarka nie obsługuje „fałszywego klikania” w języku JavaScript. Chodzi mi o to, że nie można „kliknąć” elementu za pomocą javascript. Za pomocą tagów „a” możesz wywołać zdarzenie onClick, ale link nie zmieni kolorów (w przypadku odwiedzanego koloru linku domyślnie w większości przeglądarek jest fioletowy). Dlatego nie miałoby sensu, aby zdarzenie $ (). Click działało z tagami „a”, ponieważ czynność przechodzenia do atrybutu href nie jest częścią zdarzenia onClick, ale jest zakodowana na stałe w przeglądarce.
źródło
Inną opcją jest oczywiście użycie zwykłego javascript:
źródło
Jeśli spojrzysz na kod
$.click
funkcji, założę się, że istnieje instrukcja warunkowa, która sprawdza, czy element ma zarejestrowanych detektorówclick
zdarzenia przed jego kontynuacją. Dlaczego nie pobraćhref
atrybutu z linku i ręcznie zmienić lokalizację strony?EDYCJA: Oto dlaczego nie przechodzi, z
trigger
funkcji, źródła jQuery dla wersji 1.3.2:Po wywołaniu programów obsługi (jeśli istnieją) jQuery wyzwala zdarzenie na obiekcie. Jednak wywołuje natywne programy obsługi dla zdarzeń kliknięcia tylko wtedy, gdy element nie jest łączem. Myślę, że z jakiegoś powodu zostało to zrobione celowo. Powinno to być prawdą, niezależnie od tego, czy program obsługi zdarzeń jest zdefiniowany, czy nie, więc nie jestem pewien, dlaczego w twoim przypadku dołączenie programu obsługi zdarzeń spowodowało
onClick
wywołanie natywnego programu obsługi. Będziesz musiał zrobić to, co ja, i przejść przez egzekucję, aby zobaczyć, gdzie się ona nazywa.źródło
Mechanizmy obsługi kliknięć na tagach kotwicy są szczególnym przypadkiem w jQuery.
Myślę, że możesz być zdezorientowany między zdarzeniem onclick kotwicy (znanym przez przeglądarkę) a zdarzeniem click obiektu jQuery, który zawija pojęcie DOM o tagu kotwicy.
Możesz pobrać źródło jQuery 1.3.2 tutaj .
Odpowiednie sekcje źródła to wiersze 2643-2645 (podzieliłem to na wiele wierszy, aby ułatwić zrozumienie):
źródło
JS / jQuery nie obsługuje programowo domyślnego zachowania linków „klikniętych”.
Możesz tylko utworzyć formularz i przesłać go. W ten sposób nie musisz używać
window.location
lubwindow.open
, które są często blokowane przez przeglądarki jako niechciane wyskakujące okienka.Ten skrypt ma 2 różne metody: jedną, która próbuje otworzyć 3 nowe karty / okna (otwiera tylko 1 w IE i Chrome, więcej informacji poniżej) i drugą, która uruchamia niestandardowe zdarzenie po kliknięciu linku.
Oto jak:
HTML
jQuery (script.js)
To, co robi, dotyczy każdego elementu łącza:
Teraz ładujesz nową kartę / okno
"https://google.nl"
(lub dowolny adres URL, po prostu go zastąp). Niestety, gdy próbujesz otworzyć w ten sposób więcej niż jedno okno,Popup blocked
pojawia się pasek komunikatów podczas próby otwarcia drugiego (pierwsze jest nadal otwarte).Więcej informacji o tym, jak doszedłem do tej metody, znajdziesz tutaj:
Otwieranie nowego okna / karty bez użycia
window.open
lubwindow.location.href
źródło
Uruchom element Hyperlink znajdujący się wewnątrz elementu, do którego chcesz podłączyć jquery .click ()
W swoim skrypcie łączysz się z głównym kontenerem, na którym chcesz zdarzenie kliknięcia. Następnie używasz standardowej metodologii jquery, aby znaleźć element (typ, klasę, identyfikator) i uruchomić kliknięcie. Dzieje się tak, gdy jquery wchodzi do funkcji rekurencyjnej, aby uruchomić kliknięcie, a ty przerywasz funkcję rekurencyjną, przyjmując zdarzenie „e” i funkcję stopPropagation () i zwracając false, ponieważ nie chcesz, aby jquery robił cokolwiek innego poza uruchomieniem łącza.
Alternatywnym rozwiązaniem jest zawinięcie pojemników w element i umieszczenie w nim pojemników zamiast pojemników. Ustaw rozpiętości tak, aby blok wyświetlania był zgodny ze standardami w3c.
źródło
Możesz użyć jQuery, aby wybrać obiekt jQuery dla tego elementu. Następnie pobierz podstawowy element DOM i wywołaj jego
click()
metodę.według identyfikatora
lub użyj jQuery, aby kliknąć kilka linków według klasy CSS
źródło
Nie robi nic, ponieważ żadne wydarzenia nie zostały powiązane z wydarzeniem. Jeśli dobrze pamiętam, jQuery utrzymuje własną listę programów obsługi zdarzeń, które są powiązane z NodeLists dla wydajności i innych celów.
źródło
Jeśli potrzebujesz tej funkcji dla jednego przypadku lub bardzo niewielu kaset. (cała aplikacja nie wymaga tej funkcji) Wolałbym zostawić jQuery bez zmian (z wielu powodów, w tym możliwość aktualizacji do nowszych wersji, CDN itp.) i zastosować następujące obejście:
źródło
Aby otworzyć hiperłącze w tej samej karcie, użyj:
źródło