2009-12-03 8 views
46

Je veux simuler un clic sur un lien sur une page en utilisant JavaScript. Si ce lien a une fonction liée à son événement 'onclick' (par tout autre JS sur lequel je n'ai aucun contrôle), alors cette fonction doit être appelée sinon le lien devrait se comporter normalement et ouvrir une nouvelle page.Simulation d'un clic dans jQuery/JavaScript sur un lien

Je ne suis pas sûr que juste vérifier la valeur du gestionnaire « onclick » suffirait. Je veux construire ceci pour qu'il fonctionne sur n'importe quel élément de lien.

Je ne contrôle pas sur quelle fonction binded peut-être à l'événement onclick du lien en utilisant la bibliothèque selon JS (pas nécessairement jQuery) ou JavaScript en utilisant simplement.

EDIT: À l'aide des réponses ci-dessous, il semble qu'il soit possible de vérifier les gestionnaires d'événements attachés à l'aide de jQuery ou à l'aide de l'attribut onclick. Comment puis-je vérifier les gestionnaires d'événements attachés en utilisant addEventListener/toute autre bibliothèque JS afin qu'elle soit infaillible?

+1

« Comment puis-je vérifier pour les gestionnaires d'événements associés en utilisant la bibliothèque addEventListener/tout autre JS pour qu'il soit à toute épreuve »? Maintenant * que * est un doublon;) Voir http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106#447106 –

+0

Toujours pas de résolution, cependant:) Peut-être aller dans l'autre sens et essayer de simuler un clic en créant un MouseEvent? http://stackoverflow.com/questions/1421584/how-can-i-simulate-a-click-to-an-anchor-tag – ankit

+0

@Ankit: oui exactement, cette 2ème réponse va allumer les gestionnaires, peu importe comment ils ont été attachés . Vous dites toujours "sinon le lien devrait se comporter normalement et ouvrir une nouvelle page". Vous allez avoir des problèmes avec ça. Désolé, je n'ai pas le temps d'être plus utile ici. –

Répondre

39

Vous pouvez utiliser la fonction click pour déclencher l'événement, cliquez sur l'élément sélectionné.

Exemple:

$('selector for your link').click(); 

Vous pouvez en apprendre davantage sur les différents sélecteurs jQuery de documentation.

EDIT: comme les commentateurs ci-dessous l'ont dit; Cela ne fonctionne que sur les événements attachés avec jQuery, inline ou dans le style de "element.onclick". Cela ne fonctionne pas avec addEventListener, et il ne suivra pas le lien si aucun gestionnaire d'événement n'est défini. Vous pouvez résoudre cela avec quelque chose comme ceci:

var linkEl = $('link selector'); 
if (linkEl.attr ('onclick') === undefined) { 
    document.location = linkEl.attr ('href'); 
} else { 
    linkEl.click(); 
} 

Je ne sais pas si addEventListener.

+0

Voir le commentaire à la réponse ci-dessus par Robert – ankit

+1

Ce n'est pas vrai. Cela fonctionne sur tous les événements, peu importe comment il a été lié. –

+1

La méthode click déclenche la méthode onclick d'un lien. Il ne suit pas l'URL définie dans l'attribut href. – kgiannakakis

8

Facile! Il suffit d'utiliser la fonction click jQuery:

$("#theElement").click(); 
+1

D'après ce que j'ai lu, la fonction click() de jQuery ne déclenche-t-elle que les fonctions qui ont été limitées à l'événement click de l'élément en utilisant jQuery? Cela ne fonctionne pas de toute façon. – ankit

+0

@Ankit: il déclenche également tout gestionnaire d'événement en ligne (ie onclick = "..."), mais oui, sinon vous avez raison. –

+0

@Crescent Merci, je ne savais pas que – ankit

1

Tout d'abord voir ce question pour voir comment vous pouvez trouver si un lien a un gestionnaire jQuery qui lui est attribué.

utilisation suivante:

$("a").attr("onclick") 

pour voir s'il y a un événement javascript qui lui est attribué.

Si l'une des réponses ci-dessus est vraie, appelez la méthode du clic. Sinon, procurez-vous le lien:

$("a").attr("href") 

et suivez-la.

Je crains que je ne sais pas quoi faire si addEventListener est utilisé pour ajouter un gestionnaire d'événements. Si vous êtes responsable de la source de la page complète, utilisez uniquement des gestionnaires d'événements jQuery.

+0

Vrai, mais les événements liés aux "autres JS sur lesquels je n'ai aucun contrôle" (comme le mentionne l'OP) tels que "addEventListener" ou "attachEvent" jQuery n'ont aucun moyen de les connaître: http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106 # 447106 –

+0

Cela aurait été tellement plus facile si j'étais responsable de la source de la page. Malheureusement, je construis ceci comme un plugin et donc il doit être complètement infaillible. – ankit

27

Juste

$("#your_item").trigger("click"); 

en utilisant .trigger(), vous pouvez simuler de nombreux types d'événements, il suffit de passer comme paramètre.

+0

Cela a résolu mon problème. Je vous remercie. –

0

Tout cela peut ne pas aider lorsque vous utilisez le bouton de forme à distance des rails pour simuler un clic. J'ai essayé de porter la belle simulation d'événement du prototype ici: my snippets. Je l'ai fait et ça marche pour moi.

7

Essayez cette

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(); 
    } 
} 

et vous pouvez l'utiliser comme

submitRequest("target-element-id"); 
+2

Cela fonctionne très bien. Merci d'avoir posté la version non-jquery. –

37

Pourquoi ne pas simplement le javascript bon vieux?

$('#element')[0].click()

+52

Comment va ce bon vieux javascript? C'est jQuery! – SNag

+6

En accédant au premier élément de l'ensemble jQuery, vous obtenez un élément DOM, et ensuite vous appelez une méthode de l'interface HTMLElement, qui est en fait le bon ol 'javascript – frankies

+0

Ah! ma faute. Je n'ai pas fait attention à '' [0] '. Mais pourquoi faire ça? jQuery supporte aussi la méthode '.click()', donc simplement '$ ('# element'). click()' devrait suffire. Si, d'un autre côté, vous voulez vraiment le faire en langage simple, javascript, 'document.getElementById ('élément'). Click()' ferait, non? – SNag

Questions connexes