Come posso simulare un clic di ancoraggio tramite jquery?


144

Ho un problema con la falsificazione di un clic di ancoraggio tramite jQuery: Perché il mio thickbox appare la prima volta che faccio clic sul pulsante di input, ma non la seconda o la terza volta?

Ecco il mio codice:

<input onclick="$('#thickboxId').click();" type="button" value="Click me" />

<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

Funziona sempre quando faccio clic direttamente sul collegamento, ma non se provo ad attivare il thickbox tramite il pulsante di input. Questo è in FF. Per Chrome sembra funzionare ogni volta. Qualche suggerimento?


1
Stai lasciando fuori il codice qui. Non esiste alcun codice associato all'evento click per l'ancora che ci hai mostrato. Cosa fa quel codice? C'è qualche altro codice coinvolto?
Matt,

1
@Matt Se si utilizza il metodo click senza parametri, non viene più interpretato come associazione di eventi, in realtà FARE CLIC (come se si dovesse fare clic con il mouse) sull'elemento a cui è incatenato. In questo caso, quando si fa clic sull'elemento di input, è necessario fare clic anche sull'elemento con ID 'thickboxId'.
KyleFarris,

3
@KyleFarris: l'evento click () non funziona su Chrome o Safari a meno che all'elemento a cui si fa clic non sia associato un evento onclick, e comunque attiverà solo quella parte e non passerà al valore href. Nel caso sopra, vuole che passi alla proprietà href del tag A, come se l'utente avesse fatto clic sul collegamento.
Senso

Risposte:


123

Cerca di evitare di allineare le tue chiamate jQuery in quel modo. Inserisci un tag di script nella parte superiore della pagina per associare l' clickevento:

<script type="text/javascript">
$(function(){
    $('#thickboxButton').click(function(){
        $('#thickboxId').click();
    });
});
</script>

<input id="thickboxButton" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

Modificare:

Se stai cercando di simulare fisicamente un utente facendo clic sul collegamento, non credo che sia possibile. Una soluzione alternativa sarebbe quella di aggiornare l' clickevento del pulsante per modificare window.locationin Javascript:

<script type="text/javascript">
$(function(){
    $('#thickboxButton').click(function(){
        window.location = $('#thickboxId').attr('href');
    });
});
</script>

Modifica 2:

Ora che mi rendo conto che Thickbox è un widget dell'interfaccia utente jQuery personalizzato, ho trovato le istruzioni qui :

Istruzioni:

  • Crea un elemento link ( <a href>)

  • Assegna al link un attributo di classe con un valore di thickbox ( class="thickbox")

  • Nell'attributo hrefdel collegamento aggiungere il seguente ancoraggio:#TB_inline

  • Nell'attributo hrefdopo aver #TB_inlineaggiunto la seguente stringa di query all'ancoraggio:

    ? Height = 300 & width = 300 & inlineId = myOnPageContent

  • Modificare di conseguenza i valori di altezza, larghezza e inlineId nella query (inlineID è il valore ID dell'elemento che contiene il contenuto che si desidera mostrare in ThickBox.

  • Facoltativamente, è possibile aggiungere modal = true alla stringa di query (ad esempio #TB_inline?height=155&width=300&inlineId=hiddenModalContent&modal=true) in modo che la chiusura di ThickBox richieda la chiamata della tb_remove()funzione all'interno di ThickBox. Vedi l'esempio di contenuto modale nascosto, dove è necessario fare clic su Sì o No per chiudere ThickBox.


window.location nel gestore dei clic non funziona, poiché il thickbox non funziona come previsto.
prinzdezibel,

Nel secondo esempio può essere consigliabile utilizzare .prop()invece di attr()ottenere l'URL risolto.
Kevin Bowersox,

Sono sorpreso che questa sia la risposta accettata. Il trigger di clic funzionerà solo sull'elemento DOM nativo, non sull'elemento wrapper jQuery. Questo è discusso da @Stevanicus e commenti, e su molti altri post SO. La risposta dovrebbe essere cambiata in quella di Stevanicus.
Oliver,

@Schollii: sentiti libero di modificarlo nella correttezza desiderata.
John Rasch,

3
Intendevo dire che la risposta accettata dovrebbe essere quella di @stevanicus
Oliver

194

Ciò che ha funzionato per me è stato:

$('a.mylink')[0].click()

1
. dona che la parte successiva è un nome di classe. # sarebbe per un ID.
Stevanicus,

3
Se è necessario per un input, utilizzare focusinvece di click:)
Andrius Naruševičius,

Questo funziona anche per me, ma perché funziona? Perché $ ('a.mylink') [0] .click () funziona ma $ ('a.mylink'). Eq (0) .click () no?
ChrisC,

4
[0]indica il primo elemento dell'array: un selettore restituisce 0 o più elementi quando viene eseguito. È un peccato che .click()non sembra funzionare direttamente qui poiché apparentemente altre invocazioni vengono applicate in modo coerente a raccolte di elementi da selettori in tutto il framework.
cfeduke,

8
Utilizzando [0]o .get(0)sono gli stessi. Questi usano la versione DOM dell'elemento, invece della versione jQuery. La .click()funzione in questo caso non è l'evento click jQuery, ma quello nativo.
Radley Sustaire,

19

Recentemente ho scoperto come attivare l'evento di clic del mouse tramite jQuery.

    <script type="text/javascript">
    var a = $('.path > .to > .element > a')[0];
    var e = document.createEvent('MouseEvents');
    e.initEvent( 'click', true, true );
    a.dispatchEvent(e);
    </script>

1
Non penso che funzioni in IE, almeno non 7 o 8, perché non sembra esserci un metodo createEvent sul documento.
Jeremy

Come dice aquila, questo funziona nei browser webkit. Ma nota che non stai davvero usando jQuery qui (tranne la selezione $)
tokland

1
questo manca la metà della magia: stackoverflow.com/questions/1421584/...
daniloquio

9

questo approccio funziona su firefox, chrome e IE. spero che aiuti qualcuno:

var comp = document.getElementById('yourCompId');
try { //in firefox
    comp.click();
    return;
} catch(ex) {}
try { // in chrome
    if(document.createEvent) {
        var e = document.createEvent('MouseEvents');
        e.initEvent( 'click', true, true );
        comp.dispatchEvent(e);
        return;
    }
} catch(ex) {}
try { // in IE
    if(document.createEventObject) {
         var evObj = document.createEventObject();
         comp.fireEvent("onclick", evObj);
         return;
    }
} catch(ex) {}

Secondo me, è molto utile e l'opzione migliore a causa della compatibilità incrociata. Non mi piace dover avvolgere tutto in blocchi try / catch, ma capisco che questo viene fatto per tentativi a cascata per ciascun browser.
h0r53,

8

Anche se questa è una domanda molto antica, ho trovato qualcosa di più facile da gestire in questo compito. È un plug-in jquery sviluppato dal team dell'interfaccia utente jquery chiamato simulate. puoi includerlo dopo jquery e quindi puoi fare qualcosa del genere

<a href="http://stackoverflow.com/"></a>
$('a').simulate('click');

funziona bene su Chrome, Firefox, Opera e IE10. Puoi scaricarlo da https://github.com/eduardolundgren/jquery-simulate/blob/master/jquery.simulate.js


Una caratteristica chiave di simulate()è che invia gli eventi jQuery e innesca l'azione del browser nativo. Questa è ora la risposta corretta +1
Gone Coding

Funziona come un incantesimo e mi permette di aprire la pagina in una nuova scheda quando l'utente fa clic su un pulsante nella mia griglia di kendo.
John Sully,

6

Il titolo della domanda dice "Come posso simulare un clic di ancoraggio in jQuery?". Bene, puoi usare i metodi "trigger" o "triggerHandler", in questo modo:

<script type="text/javascript" src="path/to/jquery.js"></script>
<script type="text/javascript" src="path/to/thickbox.js"></script>
<script type="text/javascript">
$(function() {
    $('#btn').click(function() {
        $('#thickboxId').triggerHandler('click');
    })
})
</script>
...
<input id="btn" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>

Non testato, questo copione attuale, ma ho già usato triggeret al, e hanno funzionato bene.

L'aggiornamento
triggerHandler non fa effettivamente ciò che l'OP vuole. Penso che 1421968 fornisca la migliore risposta a questa domanda.



4

Credo che tu possa usare:

$('#yourLink').bind('click', function() {
  //Do something over here
});

$('#yourLink').trigger('click');

Ciò attiverà facilmente la funzione clic, senza effettivamente fare clic su di essa.


2

Devi falsificare un clic di ancoraggio? Dal sito thickbox:

ThickBox può essere richiamato da un elemento di collegamento, elemento di input (in genere un pulsante) e l'elemento area (mappe immagine).

Se questo è accettabile, dovrebbe essere facile come inserire la classe thickbox sull'input stesso:

<input id="thickboxButton" type="button" class="thickbox" value="Click me">

In caso contrario, consiglierei di utilizzare Firebug e posizionare un punto di interruzione nel metodo onclick dell'elemento di ancoraggio per vedere se è attivato solo al primo clic.

Modificare:

Ok, ho dovuto provarlo da solo e per me praticamente il tuo codice ha funzionato sia su Chrome che su Firefox:

<html>
<head>
<link rel="stylesheet" href="thickbox.css" type="text/css" media="screen" />
</head>
<body>
<script src="jquery-latest.pack.js" type="text/javascript"></script>
<script src="thickbox.js" type="text/javascript"></script>
<input onclick="$('#thickboxId').click();" type="button" value="Click me">
<a id="thickboxId" href="myScript.php" class="thickbox" title="">Link</a>
</body>
</html>

La finestra si apre a prescindere se faccio clic sull'input o sull'elemento anchor. Se il codice sopra riportato funziona per te, suggerisco che l'errore risieda altrove e che tu provi a isolare il problema.

Un altro forse è che stiamo usando diverse versioni di jquery / thickbox. Sto usando quello che ho ottenuto dalla pagina thickbox - jquery 1.3.2 e thickbox 3.1.


Sì, devo simularlo e sì, lo stesso gestore di clic funziona. In realtà, non ho impostato l'evento onclick e funziona, ma solo la prima volta. Ma anche con onclick gestito in thickboxId non funzionerà.
prinzdezibel,

Quello che volevo dire era verificare che il clic nell'elemento di ancoraggio venga attivato ogni volta che si fa clic sull'elemento di input. Oh, e vedi la mia modifica sopra.
ceretta,

2

È possibile creare un modulo tramite jQuery o nel codice della pagina HTML con un'azione che imita il collegamento href:

<a id="anchor_link" href="somepath.php">click here</a>.

var link = $('#anchor_link').attr('href');
$('body').append('<form id="new_form" action="'+link+'"></form>');
$('#new_form').submit();

Questo metodo consente di ricaricare l'intera pagina anziché semplicemente saltare a un'ancora. Inoltre, aggiunge anche il "?" all'URL in modo che la pagina diventi esempio.com?#test invece di esempio.com # test . Testato su Chrome e Safari.
Senso

In FF funzionerà bene. Nei browser Webkit otterrai gli URL come descritto da Senso. Ma questo non è un problema, vero?
scritto il

2

Per simulare un clic su un'ancora durante l'atterraggio su una pagina, ho appena usato jQuery per animare la proprietà scrollTop in $(document).ready.Non è necessario un trigger complesso e funziona su Internet Explorer 6 e su ogni altro browser.


2

Se non hai bisogno di usare JQuery, come io no. Ho avuto problemi con la funzione cross browser .click(). Quindi io uso:

eval(document.getElementById('someid').href)

Veloce e sporco, ma ha funzionato per me. In jQuery questo è eval ($ ("# someid"). Attr ("href"));
mhenry1384,

2

In Javascript puoi fare così

function submitRequest(buttonId) {
    if (document.getElementById(buttonId) == null
            || document.getElementById(buttonId) == undefined) {
        return;
    }
    if (document.getElementById(buttonId).dispatchEvent) {
        var e = document.createEvent("MouseEvents");
        e.initEvent("click", true, true);
        document.getElementById(buttonId).dispatchEvent(e);
    } else {
        document.getElementById(buttonId).click();
    }
}

e puoi usarlo come

submitRequest("target-element-id");

1

Usando la sceneggiatura di Jure ho realizzato questo, per "fare clic" facilmente su tutti gli elementi che desideri.
L'ho appena utilizzato Google Reader su oltre 1600 articoli e ha funzionato perfettamente (in Firefox)!

var e = document.createEvent('MouseEvents');
e.initEvent( 'click', true, true );
$(selector).each(function(){this.dispatchEvent(e);});

Non penso che funzioni in IE, almeno non 7 o 8, perché non sembra esserci un metodo createEvent sul documento.
Jeremy

Credo che invece document.createEventObject () debba essere usato in IE, ma non l'ho provato.
fregante

@ bfred.it: createEventObjectin IE sembra più che altro creare un oggetto evento da trasmettere ai gestori, piuttosto che inviare un evento sintetico. IE fireEventpotrebbe essere più vicino dispatchEvent, ma attiverà solo i listener, non le azioni predefinite del browser. Tuttavia, in IE puoi semplicemente chiamare il clickmetodo.
theeazureshadow

1

JQuery('#left').triggerHandler('click');funziona bene in Firefox e IE7. Non l'ho provato su altri browser.

Se desideri attivare i clic automatici dell'utente, procedi come segue:

window.setInterval(function() 
    {
        $('#left').triggerHandler('click');
    }, 1000);

1

Questo non funziona sul browser nativo Android per fare clic su "elemento nascosto di input (file)":

$('a#swaswararedirectlink')[0].click();

Ma questo funziona:

$("#input-file").show();
$("#input-file")[0].click();
$("#input-file").hide();

0

Nel tentativo di simulare un "clic" nei test unitari con lo spinner dell'interfaccia utente jQuery non sono riuscito a far funzionare nessuna delle risposte precedenti. In particolare, stavo cercando di simulare lo "spin" della selezione della freccia giù. Ho esaminato i test dell'unità spinner dell'interfaccia utente jQuery e utilizzano il seguente metodo, che ha funzionato per me:

element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.