javascript - Kan jeg kalle jQuerys click() for å følge en -lenke hvis jeg ikke har bundet en hendelsesbehandler til den med bind eller click allerede?


Jeg har en timer i JavaScripten min som må emulere å klikke på en lenke for å gå til en annen side når tiden har gått ut. For å gjøre dette bruker jeg jQuerys click()-funksjon. Jeg har også brukt $().trigger() og window.location, og jeg kan få det til å fungere som ønsket med alle tre.

Jeg har observert noen merkelige oppførsel med click() og jeg prøver å forstå hva som skjer og hvorfor.

Jeg bruker Firefox til alt jeg beskriver i dette spørsmålet, men jeg er også interessert i hva andre nettlesere vil gjøre med dette.

Hvis jeg ikke har brukt $ ('a').bind('click',fn) eller $ ('a').click(fn) for å sette en hendelsesbehandler, ser det ut til at det å kalle $ ('a').click() ikke gjør noe i det hele tatt. Det kaller ikke nettleserens standardbehandler for denne hendelsen, ettersom nettleseren ikke laster den nye siden.

Men hvis jeg først setter en hendelsesbehandler, fungerer det som forventet, selv om hendelsesbehandleren ikke gjør noe.

$('a').click(function(){return true;}).click();

Dette laster den nye siden som om jeg hadde klikket på a selv.

Så mitt spørsmål er todelt: Er denne rare oppførselen fordi jeg gjør noe galt et sted? og hvorfor gjør det å kalle click() ingenting med standardoppførselen hvis jeg ikke har laget en egen håndterer?


Som Hoffman konkluderte da han prøvde å duplisere mine resultater, skjer ikke utfallet jeg beskrev ovenfor faktisk. Jeg er ikke sikker på hva som forårsaket hendelsene jeg observerte i går, men jeg er sikker i dag på at det ikke var det jeg beskrev i spørsmålet.

Så svaret er at du ikke kan "falske" klikk i nettleseren, og at alt jQuery gjør er å kalle din hendelsesbehandler. Du kan fortsatt bruke window.location for å bytte side, og det fungerer fint for meg.

Svar #1

Et annet alternativ er selvfølgelig å bare bruke vanlig JavaScript:

document.getElementById("a_link").click()

Svar #2

Interessant, dette er sannsynligvis en «funksjonsforespørsel» (dvs. bug) for jQuery. jQuery click-hendelsen utløser kun klikk-handlingen (kalt onClick-hendelse på DOM) på elementet hvis du binder en jQuery-hendelse til elementet. Du bør gå til jQuery mailinglister (http://forum.jquery.com/) og rapportere dette. Dette kan være ønsket oppførsel, men jeg tror ikke det.

REDIGER :

Jeg gjorde noen tester, og det du sa er feil. Selv om du binder en funksjon til en 'a'-tag, tar det deg fortsatt ikke til nettstedet som er spesifisert av href-attributtet. Prøv følgende kode:

<html>
<head>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
 <script>
  $(document).ready(function() {
   /* Try to dis-comment this:
   $('#a').click(function () {
    alert('jQuery.click()');
    return true;
   });
   */
  });
  function button_onClick() {
   $('#a').click();
  }
  function a_onClick() {
   alert('a_onClick');
  }
 </script>

</head>
<body>
 <input type="button" onclick="button_onClick()">
 <br>
 <a id='a' href='http://www.google.com' onClick="a_onClick()"> aaa </a>

</body>
</html> 

Det går aldri til google.com med mindre du direkte klikker på lenken (med eller uten den kommenterte koden). Legg også merke til at selv om du binder klikkhendelsen til lenken, blir den fortsatt ikke lilla når du klikker på knappen. Den blir bare lilla hvis du klikker på lenken direkte.

Jeg gjorde litt research, og det ser ut til at .click ikke skal fungere med 'a'-tagger fordi nettleseren ikke støtter "falsk klikk" med JavaScript. Jeg mener, du kan ikke "klikke" på et element med JavaScript. Med 'a'-tagger kan du utløse onClick-hendelsen, men lenken vil ikke endre farge (til besøkt lenke-farge, standarden er lilla i de fleste nettlesere). Så det ville ikke gi mening å få $().click-hendelsen til å fungere med 'a'-tagger siden handlingen med å gå til href-attributtet ikke er en del av onClick-hendelsen, men er hardkodet i nettleseren.

Svar #3

Hvis du ser på koden for $.click-funksjonen, vil jeg vedde på at det finnes en betinget setning som sjekker om elementet har lyttere registrert for click-hendelsen før det fortsetter. Hvorfor ikke bare hente href-attributtet fra lenken og manuelt endre sidens plassering?

 window.location.href = $('a').attr('href');

Her er hvorfor det ikke klikkes gjennom. Fra trigger-funksjonen, jQuery-kilde for versjon 1.3.2:

 // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
 if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
     event.result = false;

 // Trigger the native events (except for clicks on links)
 if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
     this.triggered = true;
     try {
         elem[ type ]();
         // Prevent Internet Explorer from throwing an error for some hidden elements
     }
     catch (e)
     {
     }
 }

Etter at det kaller håndterere (hvis det finnes noen), utløser jQuery en hendelse på objektet. Imidlertid kaller det bare native håndterere for klikkhendelser hvis elementet ikke er en link. Jeg antar at dette ble gjort med vilje av en grunn. Dette bør imidlertid være sant uansett om en hendelsesbehandler er definert eller ikke, så jeg er ikke sikker på hvorfor det i ditt tilfelle å legge til en hendelsesbehandler førte til at den native onClick-håndtereren ble kalt. Du må gjøre det jeg gjorde og gå gjennom kjøringen steg for steg for å se hvor den blir kalt.

Relaterte artikler