1366 votes

Comment modifier l'attribut href d'un hyperlien en utilisant jQuery

Comment pouvez-vous changer l'attribut href (cible du lien) pour un lien hypertexte en utilisant jQuery?

17 votes

Pour ceux d'entre vous intéressés par des solutions sans l'utilisation de jQuery - stackoverflow.com/questions/179713/…

2 votes

Pour les nouvelles versions de jQuery : stackoverflow.com/a/6348239/4928642

2 votes

Le plus simple exemple sans jQuery stackoverflow.com/a/39276418/696535

1955voto

Shog9 Points 82052

Utiliser

$("a").attr("href", "http://www.google.com/")

modifiera l'attribut href de tous les liens hypertextes pour pointer vers Google. Vous voudrez probablement un sélecteur un peu plus raffiné cependant. Par exemple, si vous avez un mélange de balises de lien source (hyperlien) et de balises d'ancrage de lien (alias "ancre") :

Le CodeProject

...Alors vous ne voudrez probablement pas ajouter accidentellement des attributs href à ceux-ci. Pour des raisons de sécurité, nous pouvons spécifier que notre sélecteur ne correspondra qu'aux balises avec un attribut href existant:

$("a[href]") //...

Bien sûr, vous aurez probablement quelque chose de plus intéressant en tête. Si vous voulez faire correspondre une ancre avec un href spécifique existant, vous pourriez utiliser quelque chose comme cela :

$("a[href='http://www.google.com/']").attr('href', 'http://www.live.com/')

Cela trouvera des liens où le href correspond exactement à la chaîne http://www.google.com/. Une tâche plus complexe pourrait consister à faire correspondre, puis à mettre à jour uniquement une partie du href:

$("a[href^='http://stackoverflow.com']")
   .each(function()
   { 
      this.href = this.href.replace(/^http:\/\/beta\.stackoverflow\.com/, 
         "http://stackoverflow.com");
   });

La première partie sélectionne uniquement les liens où l'href commence par http://stackoverflow.com. Ensuite, une fonction est définie qui utilise une expression régulière simple pour remplacer cette partie de l'URL par une nouvelle. Notez la flexibilité que cela vous donne - toute sorte de modification du lien pourrait être faite ici.

5 votes

"En HTML, les noms des éléments ne sont pas sensibles à la casse, mais en XML ils le sont." - w3.org/TR/CSS21/selector.html

51 votes

Pour plus de clarté, étant donné que cela est toujours parfois lié, j'ajouterai que depuis jQuery 1.4, le dernier exemple ne nécessite plus l'utilisation de each - ce qui suit serait maintenant possible : $(sélecteur).attr('href', function() { return this.replace(/.../, '...'); });

16 votes

@DavidHedlund Légère correction : vous avez oublié le href : ...return this.href.replace(/.../, '...'); });

301voto

Jerome Points 1201

Avec jQuery 1.6 et supérieur, vous devriez utiliser :

$("a").prop("href", "http://www.jakcms.com")

La différence entre prop et attr est que attr récupère l'attribut HTML tandis que prop récupère la propriété du DOM.

Vous pouvez trouver plus de détails dans ce post : .prop() vs .attr()

34 votes

Une explication sur pourquoi vous devriez utiliser prop plutôt que attr serait appréciée, pour les personnes consultent la question et constatent que attr fonctionne apparemment parfaitement bien dans les nouvelles versions de jQuery...

13 votes

@womble en utilisant prop est plus rapide que attr car il met à jour le dom au lieu de modifier le HTML. jsfiddle.net/je4G5

3 votes

@Popnoodles Il y a plus de problèmes que ça, mais ce serait trop long à expliquer tous ici. Donc les lecteurs devraient juste jeter un coup d'œil au post que womble a lié. Cependant, un résumé ici serait bien, sinon cette information risque d'être un peu perdue.

85voto

Peter Shinners Points 1865

Utilisez la méthode attr sur votre recherche. Vous pouvez remplacer n'importe quel attribut par une nouvelle valeur.

$("a.mylink").attr("href", "http://cupcream.com");

3 votes

Cela a fonctionné pour moi si je définis la classe "mylink" dans la balise a. Je voulais simplement clarifier au cas où quelqu'un essaierait de définir name="mylink" de manière similaire à la réponse ci-dessus et s'attendrait à ce que cela fonctionne.

44voto

flamingLogos Points 3637

En fonction que vous vouliez changer tous les liens identiques vers autre chose ou que vous vouliez contrôler uniquement ceux dans une section donnée de la page ou chacun individuellement, vous pourriez faire l'une de ces choses.

Changer tous les liens pour pointer vers Google Maps :

$("a[href='http://www.google.com/']").attr('href', 
'http://maps.google.com/');

[

Pour changer les liens dans une section donnée, ajoutez la classe du div conteneur au sélecteur. Cet exemple changera le lien Google dans le contenu, mais pas dans le pied de page:

](http://www.google.com)

`

...lien vers Google     dans le contenu...

    Liens : Google

$(".content a[href='http://www.google.com/']").attr('href', 'http://maps.google.com/');`

Pour changer les liens individuels indépendamment de leur emplacement dans le document, ajoutez un id au lien, puis ajoutez cet id au sélecteur. Cet exemple changera le deuxième lien Google dans le contenu, mais pas le premier ni celui dans le pied de page:

    ...lien vers Google
    dans le contenu...
    ...deuxième lien vers Google
    dans le contenu...

    Liens : Google

$("a#changeme").attr('href', 
'http://maps.google.com/');

10voto

crafter Points 2304

Ce snippet est invoqué lorsqu'un lien de la classe 'menu_link' est cliqué et affiche le texte et l'URL du lien. Le retour false empêche le lien d'être suivi.

Option 1
Option 2

$('.menu_link').live('click', function() {
   var thelink = $(this);
   alert ( thelink.html() );
   alert ( thelink.attr('href') );
   alert ( thelink.attr('rel') );

   return false;
});

5 votes

Je ne suis pas trop pointilleux à propos du vote négatif, mais si vous ne dites pas pourquoi vous votez négativement, rien n'est accompli et cela ne vaut pas la peine.

3 votes

Down-voted because your snippet and answer doesn't answer the original question, and doesn't really provide any explanation of why the information obtained using the snippet is helpful.

6 votes

Baisser le vote de cette réponse est pointilleux. Il/elle n'a peut-être pas mis autant d'effort dans sa réponse que d'autres utilisateurs l'ont fait, mais il/elle a en effet fourni du code pour résoudre le problème. L'OP aurait juste besoin de réfléchir un peu plus avant de copier-coller une solution personnalisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X