77 votes

Tester si les liens sont externes avec jQuery / javascript?

Comment puis-je tester pour voir si certains liens sont externes ou internes? Veuillez noter:

  1. Je ne peux pas coder en dur le domaine local.
  2. Je ne peux pas tester pour le "http". Je pourrais tout aussi facilement un lien vers mon propre site avec http d'un lien absolu.
  3. Je veux utiliser jQuery / javascript, pas de css.

Je soupçonne que la réponse se trouve quelque part dans l'emplacement.href, mais la solution m'échappe.

Merci!


Mise à jour: Grâce à jAndy, j'ai une version légèrement modifiée de ce à quoi il a répondu:

        hostname = new RegExp(location.host);
        // Act on each link
        $('a').each(function(){

            // Store current link's url
            var url = $(this).attr("href");

            // Test if current host (domain) is in it
            if(hostname.test(url)){
               // If it's local...
               $(this).addClass('local');
            }
            else if(url.slice(0, 1) == "#"){
                // It's an anchor link
                $(this).addClass('anchor'); 
            }
            else {
               // a link that does not contain the current host
               $(this).addClass('external');                        
            }
        });

74voto

Daved Points 519

Je sais que cet article est vieux mais il reste visible au sommet des résultats, alors je voulais proposer une autre approche. Je vois toutes les vérifications de regex sur un élément anchor, mais pourquoi ne pas simplement utiliser location.host et this.host?

dans jQuery

 $('a').each(function () {
    if (this.host !== location.host) {
        // external
    }
    else {
        // internal
    }
});
 

ou plaine JS

 var links = document.getElementsByTagName('a');
for (var i = links.length - 1; i > 0; i--) {
    if (links[i].host !== location.host) {
        // external
    }
    else {
        // internal
    }
}
 

66voto

jAndy Points 93076
 var comp = new RegExp(location.host);

$('a').each(function(){
   if(comp.test($(this).attr('href'))){
       // a link that contains the current host           
       $(this).addClass('local');
   }
   else{
       // a link that does not contain the current host
       $(this).addClass('external');
   }
});
 

Remarque: ceci est juste un exemple rapide et sale. Cela correspond à tous les liens href = "# anchor" aussi externe. Il pourrait être amélioré en faisant une vérification supplémentaire de RegExp.

37voto

Sean Kinsey Points 17117

Et la manière no-jQuery

 var nodes = document.getElementsByTagName("a"), i = nodes.length;
var regExp = new RegExp("//" + location.host + "($|/)");
while(i--){
    var href = nodes[i].href;
    var isLocal = (href.substring(0,4) === "http") ? regExp.test(href) : true;
    alert(href + " is " + (isLocal ? "local" : "not local"));
}
 

Tous les hrefs ne commençant pas par http (http: //, https: //) sont automatiquement traités comme locaux.

9voto

James Points 56229
 var external = RegExp('^((f|ht)tps?:)?//(?!' + location.host + ')');
 

Usage:

 external.test('some url'); // => true or false
 

7voto

Blazemonger Points 39230

Voici un sélecteur jQuery pour les seuls liens externes:

$('a[href*="://"])') 

Un sélecteur jQuery uniquement pour les liens internes (non compris les hash des liens au sein de la même page) doit être un peu plus compliqué:

$('a:not([href*="://"],[href^="#"],[href^="mailto:"])')

Des filtres supplémentaires peuvent être placés à l'intérieur de l' :not() condition et séparés par des virgules supplémentaires au besoin.

http://jsfiddle.net/mblase75/Pavg2/


Alternativement, nous pouvons filtrer les liens internes à l'aide de la vanille JavaScript href de la propriété, qui est toujours une URL absolue:

$('a').filter( function(i,el) {
    return el.href.indexOf(location.protocol+'//'+location.hostname)===0;
})

http://jsfiddle.net/mblase75/7z6EV/

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