Jak wywołać zdarzenie kliknięcia elementu href

80

Próbuję wywołać zdarzenie kliknięcia hiperłącza za pomocą jQuery w sposób przedstawiony poniżej. Hiperłącze nie ma żadnego identyfikatora, ale ma klasę css

 $(document).ready(function () {  $('.cssbuttongo').trigger('click'); }); 

Powyższa funkcja nie działa. To jest hiperłącze

<a href="hyperlinkurl" class="cssbuttongo">hyperlink anchor</a>
MonsterMMORPG
źródło
1
Ponieważ klasę można zastosować do kilku elementów DOM, nie wydaje się dobrym pomysłem wywołanie ich kliknięcia.
Igor Parra
1
NomikOS masz co do tego rację, ale sprawdziłem, czy jakikolwiek inny element używa tej klasy css :)
MonsterMMORPG

Odpowiedzi:

78

Nie mam faktycznych dowodów, aby to udowodnić, ale już napotkałem ten problem. Wygląda na to, że wywołanie zdarzenia click () w <a>tagu nie działa w taki sam sposób, jakiego można by oczekiwać w przypadku, na przykład, przycisku wprowadzania.

Rozwiązaniem, które zastosowałem, było ustawienie właściwości location.href w oknie, co powoduje, że przeglądarka ładuje zasób żądania w następujący sposób:

$(document).ready(function()
{
      var href = $('.cssbuttongo').attr('href');
      window.location.href = href; //causes the browser to refresh and load the requested url
   });
});

Edytować:

Zrobiłbym skrzypce js, ale natura pytania zmieszana z tym, jak jsfiddle używa iframe do renderowania kodu, sprawia, że ​​nie idzie.

Matthew Cox
źródło
to jest poprawna odpowiedź. dziękuję :) Zauważyłem też, że kliknięcie na href nie działa.
MonsterMMORPG
@MonsterMMorpg Należy pamiętać, że nie powoduje to w przeglądarce przekonania, że ​​jest to bezpośrednie działanie użytkownika. Więc mądrze użyj = D
Matthew Cox
Czy nie powinno to być var ​​href = $ ('. Cssbuttongo'). Attr ('href');
Luci,
7
To ignoruje możliwość, że łącze ma również onclickzdarzenie. Po prostu wykonaj, $('.cssbuttongo')[0].click()aby poprawnie zasymulować kliknięcie w całości.
Roman Starkov
W rzeczywistości działa tylko na pełnym href. Ponieważ nie mogłem tutaj umieścić kodu, przeczytaj moją odpowiedź na ten post.
Alan Dong
210

Natywna metoda DOM działa właściwie:

$('.cssbuttongo')[0].click();
                  ^
              Important!

Działa to niezależnie od tego, czy hrefjest to adres URL, fragment (np. #blah) Czy nawet javascript:.

Zauważ, że wywołuje to clickmetodę DOM zamiast metody jQuery click(która jest bardzo niekompletna i całkowicie ignoruje href).

Roman Starkov
źródło
2
@Timwi, chciałem powiedzieć, że pierwszy $('.cssbuttongo').click(); // ignores href!nie zagwarantuje, że zadziała. Ten drugi zawsze będzie działał, ponieważ użycie indeksu [0] spowoduje, że obiekt jQuery stanie się zwykłym obiektem JS, który jest dokładnie taki sam, jakiego używa przeglądarka. @Wei Liu
Alan Dong
1
Niesamowite! Bardzo bezpośrednia i obrazowa odpowiedź.
caiosm1005
11
To powinna być wybrana odpowiedź. Działało idealnie!
Amit G
3
@AdilMalik To działa, ponieważ jquery nie jest jedyną rzeczą, która ma metodę click (). Ten kod wywołuje metodę click () inną niż jquery, jest to natywny DOM.
Roman Starkov
1
@Timwi Dostarczam jsfiddle tutaj: jsfiddle.net/NabiKAZ/3gv90od5
Nabi KAZ
31

Oprócz świetnej odpowiedzi romkyns ... tutaj jest odpowiednia dokumentacja / przykłady.


Elementy DOM mają .click()metodę natywną .

HTMLElement.click()Sposób symuluje kliknięcie myszy na elemencie.

Gdy używane jest kliknięcie, uruchamia również zdarzenie kliknięcia elementu, które spowoduje przejście do elementów znajdujących się wyżej w drzewie dokumentu (lub łańcuch zdarzeń) i uruchomi również zdarzenia kliknięcia. Jednak bulgotanie zdarzenia kliknięcia nie spowoduje, że <a>element zainicjuje nawigację tak, jakby otrzymano prawdziwe kliknięcie myszą. (odniesienie do mdn)

Odpowiednia dokumentacja W3 .


Kilka przykładów ...

  • Możesz uzyskać dostęp do określonego elementu DOM z obiektu jQuery: (przykład)

      $('a')[0].click();
    
  • Możesz użyć tej .get()metody, aby pobrać element DOM z obiektu jQuery: (przykład)

      $('a').get(0).click();
    
  • Zgodnie z oczekiwaniami możesz wybrać element DOM i wywołać .click()metodę. (przykład)

      document.querySelector('a').click();
    

Warto zaznaczyć, że jQuery nie jest wymagane do wywołania .click()zdarzenia natywnego .

Josh Crozier
źródło
4

Wywołanie kliknięcia przez JavaScript nie spowoduje otwarcia hiperłącza. Jest to środek bezpieczeństwa wbudowany w przeglądarkę.

Zobacz to pytanie, aby poznać niektóre obejścia.

Blazemonger
źródło
1
Nie sądzę więc .. bo: Znalazłem jego pracy takie jak ta .. Wykonaj jsfiddle tutaj
Cody
3
@CodyDmd to nadal zdarzenie kliknięcia wyzwalane przez użytkownika. To nie to samo, co pierwotne pytanie OP.
Blazemonger,
@CodyDmd Wygląda na [0]to, że jest to ważne w twoich skrzypcach
Wei Liu
3
Przed jaką luką to dokładnie chroni?
Roman Starkov
3
Cóż, nie wiem, co masz na myśli, Blazemonger, ponieważ nie ma takiej ochrony przed pobieraniem lub oszustwami SEO w przeglądarce Firefox, Chrome ani IE11. Innymi słowy, zarówno pierwsze, jak i drugie zdanie Twojej odpowiedzi są fałszywe .
Roman Starkov
3

Chcę tylko powiedzieć, że zaakceptowana odpowiedź nie zawsze działa.

Oto przykład, że się nie powiedzie.

gdyby <href='/list'>

href = $('css_selector').attr('href')
"/list"
href = document.querySelector('css_selector').href
"http://localhost/list"

lub możesz dołączyć do tego href z jQuery

href = document.URL +$('css_selector').attr('href');

lub sposób jQuery

href = $('css_selector').prop('href')

Na koniec wywołaj go, aby zmienić adres URL bieżącej strony przeglądarki

window.location.href = href

lub wyskocz za pomocą window.open(url)

Oto przykład w JSFiddle.

Alan Dong
źródło
Więc mówisz, że to nie zadziała, jeśli zmienisz to na $('css_selector')[0].click()? To działa w tym JsFiddle ...
Roman Starkov
Dla przypomnienia, to nie ja przegłosowałem; Myślę, że coś tu może być i jeszcze nie jestem pewien.
Roman Starkov
@romkyns, Oczywiście będzie działać po wyodrębnieniu z elementów jQuery przy użyciu [0] (staje się czystym JS), chciałem powiedzieć, $('.cssbuttongo').click();że nie zadziała, ponieważ podaje tylko wartość href, zamiast adresu URL przeglądarka używa. Przepraszamy za mylące komentarze.
Alan Dong
2
@LinDong: Jeśli wiesz, że to [0].click()działa, dlaczego w Twojej odpowiedzi o tym nie ma?
Timwi
location.hrefakceptuje ścieżki względne, więc użycie /listspowoduje automatyczne dołączenie bieżącej domeny. Więc to działa.
Tim
-1

Miałem podobny problem, jak kliknąć przycisk zamiast łącza. Nie udało się to w metodach .trigger ('click') lub [0] .click () i nie wiedziałem dlaczego. W końcu zadziałały dla mnie:

$('#elementid').mousedown();
Henz
źródło