Tester si les liens sont externes avec jQuery / javascript?
Comment puis-je tester pour voir si des liens sont externes ou internes? Veuillez noter:
- Je ne peux pas coder en dur le domaine local.
- Je ne peux pas tester pour le "http". Je pourrais tout aussi facilement un lien vers mon propre site avec un http lien absolu.
- 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!
- voulez-vous vérifier lorsque le lien est cliqué, ou au chargement de la page?
- chargement de la page, merci.
- Votre réponse ne fonctionne pas. Tous les contrôles doivent être effectués sur
element.href
(depuis les DOM) au lieu de$(element).attr('href')
. La preuve: jsfiddle.net/rahzy/1 s'il vous Plaît accepter de Sean réponse.
Vous devez vous connecter pour publier un commentaire.
Note: ceci est juste un rapide & sale exemple. Il pourrait correspondre à tous href="#ancre" liens
externe aussi. Il pourrait être amélioré en faisant quelques extra RegExp vérification.
Mise à jour 2016-11-17
Cette question encore beaucoup de trafic et j'ai été informé par une tonne de gens que cette solution retenue va échouer à plusieurs reprises. Comme je l'ai dit, cela a été très rapide et sale de répondre à montrer la voie principale comment résoudre ce problème. Une solution plus élaborée consiste à utiliser les propriétés qui sont accessibles sur un
<a>
(ancrage) de l'élément. Comme @Daved a déjà souligné dans cette réponse, la clé est de comparer leshostname
avec le courantwindow.location.hostname
. Je préfère comparer lahostname
propriétés, parce qu'ils ne comprennent jamais leport
qui est inclus à lahost
propriété si elle diffère de 80.Donc, ici, nous allons:
Etat de l'art:
attr
est censé retourner l'attribut, et non pas la propriété (la propriété pourraient être résolus, de ne pas l'attribut).Array.from
dans la dernière partie de votre réponse, il vous suffit de placer l'expression dans les parenthèses pour devenir(document.querySelectorAll( 'a' )).forEach
forEach
méthode sur laHTMLElement prototype
. Je n'ose pas appeler directement que même aujourd'hui, pour être honnête. Bien sûr, il ya encore quelques versions mobiles et des navigateurs qui ne supportent pasArray.from
, mais les chances sont de plus ici, que.forEach
être sur le prototype.Je sais que ce post est vieux, mais il apparaît toujours en haut de résultats donc j'ai voulu proposer une autre approche. Je vois tous les regex vérifie sur un point d'ancrage de l'élément, mais pourquoi ne pas simplement utiliser
window.location.host
et de contre-vérifier l'élémenthost
propriété?Avec jQuery:
et avec du javascript:
a.host
propriété qui est probablement inconnu à la moyenne développeur JavaScript (y compris moi-même avant de lire ceci).Et la non-jQuery façon
Tous hrefs pas au début avec
http
(http://, https://) sont automatiquement traités comme des locauxlocation.protocol+'//'+location.host
. Vérifiez ce violon: jsfiddle.net/framp/Ag3BT/1href="//somedomain.com/some-path"
Utilisation:
Voici un sélecteur jQuery pour les seuls liens externes:
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é:
Des filtres supplémentaires peuvent être placés à l'intérieur de la
:not()
état 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:http://jsfiddle.net/mblase75/7z6EV/
Uncaught Error: Syntax error, unrecognized expression: a[href^="(http:|https:)?//"])
Vous avez oublié un, que si vous utilisez un chemin relatif.
parexemple: /test
Il y a aussi la question de téléchargements de fichiers .zip locaux (en externe), qui pourrait utiliser les classes locales "télécharger" ou "externe" télécharger". Mais n'ai pas trouvé de solution pour l'instant.
/
. Vous pouvez faire référence à quelque chose commeimages/logo.png
qui est un dossier vers le bas à partir de votre emplacement actuel. Dans ce cas, vous faites référence à un chemin relatif dans votre URL relative, il aura un sens différent dans différents répertoires de votre site./images/logo.png
est un chemin absolu de ce site, il est en cours d'exécution sur (d'où la relativité). Votre code ne sera pas inclure des chemins relatifs, commeimages/logo.png
.Vous pouvez utiliser est-url-externe module.
JS:
HTML:
Cela devrait fonctionner pour tout type de lien sur tous les navigateurs sauf IE.
Oui, je crois que vous pouvez récupérer le nom de domaine actuel emplacement.href. Une autre possibilité est de créer un élément de lien, de définir la src /et puis la récupération de l'URL canonique (ce qui permettra de récupérer l'URL de base si vous en utilisez un, et pas nécessairement le nom de domaine).
Aussi voir ce post: Obtenez de l'URI complète de la href propriété d'un lien
Pour ceux qui sont intéressés, j'ai fait un ternaire version de la si le bloc avec un chèque de voir ce que les classes de l'élément a et de la classe sont attachées.
Google analytics bits peuvent être ignorées, mais c'est là que vous auriez probablement envie de faire quelque chose avec l'url maintenant que vous savez quel type de lien, il est. Ajoutez simplement le code à l'intérieur du ternaire bloc.
Si vous voulez seulement vérifier 1 type de lien, puis remplacer le ternaires avec une instruction if à la place.
Modifié pour ajouter une question, je suis venu à travers. Certains de mes hrefs étaient "/Cours/" comme si. J'ai fait un chèque pour un localpage qui vérifie si il y a un slash au début et à la fin de href. Bien que la simple vérification par un " /" au début, est probablement suffisant.
J'utilise cette fonction pour jQuery:
D'Usage:
$('a').isExternal();
Exemple: https://codepen.io/allurewebsolutions/pen/ygJPgV