J'ai une minuterie dans mon JavaScript qui doit émuler en cliquant sur un lien pour accéder à une autre page une fois le temps écoulé. Pour ce faire, j'utilise la click()
fonction de jQuery . J'ai utilisé $().trigger()
et window.location
aussi, et je peux le faire fonctionner comme prévu avec les trois.
J'ai observé un comportement étrange avec click()
et j'essaie de comprendre ce qui se passe et pourquoi.
J'utilise Firefox pour tout ce que je décris dans cette question, mais je suis également intéressé par ce que les autres navigateurs en feront.
Si je n'ai pas utilisé $('a').bind('click',fn)
ou $('a').click(fn)
défini de gestionnaire d'événements, alors l'appel $('a').click()
semble ne rien faire du tout. Il n'appelle pas le gestionnaire par défaut du navigateur pour cet événement, car le navigateur ne charge pas la nouvelle page.
Cependant, si je définis d'abord un gestionnaire d'événements, cela fonctionne comme prévu, même si le gestionnaire d'événements ne fait rien.
$('a').click(function(){return true;}).click();
Cela charge la nouvelle page comme si j'avais cliqué sur le moi-même.
Ma question est donc double: est-ce un comportement étrange parce que je fais quelque chose de mal quelque part? et pourquoi l'appel click()
ne fait rien avec le comportement par défaut si je n'ai pas créé mon propre gestionnaire?
ÉDITER:
Comme Hoffman l'a déterminé lorsqu'il a essayé de reproduire mes résultats, le résultat que j'ai décrit ci-dessus ne se produit pas réellement. Je ne suis pas sûr de la cause des événements que j'ai observés hier, mais je suis certain aujourd'hui que ce n'est pas ce que j'ai décrit dans la question.
Donc, la réponse est que vous ne pouvez pas "faux" clics dans le navigateur et que tout ce que jQuery fait est d'appeler votre gestionnaire d'événements. Vous pouvez toujours utiliser window.location
pour changer de page, et cela fonctionne très bien pour moi.
Réponses:
Intéressant, il s'agit probablement d'une "demande de fonctionnalité" (ie bug) pour jQuery. L'événement de clic jQuery ne déclenche l'action de clic (appelée événement onClick sur le DOM) que si vous liez un événement jQuery à l'élément. Vous devriez aller sur les listes de diffusion jQuery ( http://forum.jquery.com/ ) et le signaler. C'est peut-être le comportement recherché, mais je ne pense pas.
ÉDITER:
J'ai fait quelques tests et ce que vous avez dit est faux, même si vous liez une fonction à une balise «a», cela ne vous amène toujours pas au site Web spécifié par l'attribut href. Essayez le code suivant:
Il ne va jamais sur google.com sauf si vous cliquez directement sur le lien (avec ou sans le code commenté). Notez également que même si vous liez l'événement de clic au lien, il ne devient toujours pas violet une fois que vous cliquez sur le bouton. Il ne devient violet que si vous cliquez directement sur le lien.
J'ai fait quelques recherches et il semble que le .click ne soit pas supposé fonctionner avec les balises 'a' car le navigateur ne supporte pas le "faux clic" avec javascript. Je veux dire, vous ne pouvez pas "cliquer" sur un élément avec javascript. Avec les balises «a», vous pouvez déclencher son événement onClick mais le lien ne changera pas de couleur (en couleur du lien visité, la couleur par défaut est le violet dans la plupart des navigateurs). Cela n'aurait donc pas de sens de faire fonctionner l'événement $ (). Click avec les balises 'a' puisque l'acte d'aller à l'attribut href ne fait pas partie de l'événement onClick, mais est codé en dur dans le navigateur.
la source
Une autre option est bien sûr d'utiliser simplement du javascript vanille:
la source
Si vous regardez le code de la
$.click
fonction, je parie qu'il y a une instruction conditionnelle qui vérifie si l'élément a des écouteurs enregistrés pour l'click
événement avant qu'il ne se poursuive. Pourquoi ne pas simplement obtenir l'href
attribut à partir du lien et modifier manuellement l'emplacement de la page?EDIT: Voici pourquoi il ne clique pas, à partir de la
trigger
fonction, source jQuery pour la version 1.3.2:Après avoir appelé des gestionnaires (s'il y en a), jQuery déclenche un événement sur l'objet. Cependant, il n'appelle des gestionnaires natifs pour les événements de clic que si l'élément n'est pas un lien. Je suppose que cela a été fait à dessein pour une raison quelconque. Cela devrait être vrai, qu'un gestionnaire d'événements soit défini ou non, donc je ne sais pas pourquoi dans votre cas, l'attachement d'un gestionnaire d'événements a provoqué l'
onClick
appel du gestionnaire natif . Vous devrez faire ce que j'ai fait et parcourir l'exécution pour voir où elle est appelée.la source
Les gestionnaires de clics sur les balises d'ancrage sont un cas particulier dans jQuery.
Je pense que vous pourriez être confus entre l'événement onclick de l'ancre (connu par le navigateur) et l'événement click de l'objet jQuery qui englobe la notion DOM de la balise d'ancrage.
Vous pouvez télécharger la source jQuery 1.3.2 ici .
Les sections pertinentes de la source sont les lignes 2643-2645 (j'ai divisé ceci en plusieurs lignes pour le rendre plus facile à comprendre):
la source
JS / jQuery ne prend pas en charge le comportement par défaut des liens «cliqués» par programmation.
Ce que vous pouvez faire, c'est créer un formulaire et le soumettre. De cette façon, vous n'avez pas à utiliser
window.location
ouwindow.open
, qui sont souvent bloqués en tant que fenêtres contextuelles indésirables par les navigateurs.Ce script a 2 méthodes différentes: une qui essaie d'ouvrir 3 nouveaux onglets / fenêtres (il n'en ouvre qu'un dans IE et Chrome, plus d'informations ci-dessous) et une qui déclenche un événement personnalisé lors d'un clic sur le lien.
Voici comment:
HTML
jQuery (script.js)
Ce qu'il fait est pour chaque élément de lien:
Maintenant vous avez un nouvel onglet / fenêtre de chargement
"https://google.nl"
(ou n'importe quelle URL que vous voulez, remplacez-le simplement). Malheureusement, lorsque vous essayez d'ouvrir plus d'une fenêtre de cette façon, vous obtenez unePopup blocked
barre de messages lorsque vous essayez d'ouvrir la seconde (la première est toujours ouverte).Plus d'informations sur la façon dont je suis arrivé à cette méthode se trouvent ici:
Ouverture d'une nouvelle fenêtre / onglet sans utiliser
window.open
ouwindow.location.href
la source
Déclenchez un élément Hyperlink qui se trouve à l'intérieur de l'élément auquel vous souhaitez connecter la jquery .click ()
Dans votre script, vous vous connectez au conteneur principal sur lequel vous souhaitez que l'événement de clic. Ensuite, vous utilisez la méthodologie jquery standard pour trouver l'élément (type, classe, id) et déclencher le clic. Ce qui se passe, c'est que jquery entre dans une fonction récursive pour déclencher le clic et que vous interrompez la fonction récursive en prenant l'événement 'e' et la fonction stopPropagation () et retournez false parce que vous ne voulez pas que jquery fasse autre chose que déclencher le lien.
Une solution alternative consiste à envelopper les conteneurs dans l'élément et à les placer comme conteneurs à l'intérieur au lieu de ceux. Définissez les portées pour afficher le bloc pour se conformer aux normes w3c.
la source
Vous pouvez utiliser jQuery pour sélectionner l'objet jQuery pour cet élément. Ensuite, récupérez l'élément DOM sous-jacent et appelez son
click()
méthode.par identifiant
ou utilisez jQuery pour cliquer sur un tas de liens par classe CSS
la source
Il ne fait rien car aucun événement n'a été lié à l'événement. Si je me souviens bien, jQuery maintient sa propre liste de gestionnaires d'événements liés à NodeLists à des fins de performances et à d'autres fins.
la source
Si vous avez besoin de cette fonctionnalité pour un cas ou très peu de cas. (toute votre application ne nécessite pas cette fonctionnalité) Je préfère laisser jQuery tel quel (pour de nombreuses raisons, y compris la possibilité de mettre à jour vers des versions plus récentes, CDN, etc.) et avoir la solution de contournement suivante:
la source
Pour ouvrir le lien hypertexte dans le même onglet, utilisez:
la source