Le moyen le plus rapide pour détecter les Url externes
Quelle est la méthode la plus rapide pour détecter si foo='http://john.doe'
est une url (en comparaison à window.location.href
)?
- Que feriez-vous envisager de l'extérieur? Schéma différent/host/port?
- rapide, simple, précis: choisir 2?
- ce pourrait être une solution : stackoverflow.com/questions/2910946/...
- Quelle est la façon la plus lente?
- Est votre façon actuelle lent?
- Quels sont exactement ce que tu fais avec ces 20k ancres?
Vous devez vous connecter pour publier un commentaire.
Je sais que la regex version a déjà été accepté, mais je serais prêt à parier que c'est "plus rapide" que de faire de complexe d'une regex.
String.replace
est assez rapide.Mise à jour
J'ai décidé de faire un peu plus de recherche sur ce sujet et a trouvé une méthode plus rapide qui utilise une Regex.
Dans IE c'est légèrement plus rapide que la
String.replace
méthode. Cependant dans Chrome et Firefox, il est environ deux fois plus vite. Aussi, la définition de l'expression rationnelle qu'une seule fois à l'intérieur de la clôture, au lieu de juste à l'intérieur de la fonction normalement c'est environ 30% plus rapide dans Firefox.Voici une jsperf l'examen de quatre façons différentes de détermination d'un nom d'hôte externe.
Il est important de noter que chaque méthode, j'ai essayé prend moins de 1ms à fonctionner même sur un vieux téléphone. De sorte que les performances ne devrait probablement pas être votre principale considération, sauf si vous faites des certains grands le traitement par lot.
magnet:
oumailto:
?location.href
dans mondomain
fonction au lieu deurl
. Avec qui a changé, il fonctionne désormais correctement pour les autres protocoles.localhost
===localhost:123
? Un port différent sur le même hôte est considéré comme provenant d'une origine différente, par définition. La SCRO signifie Cross-Origin-le Partage des Ressources. C'est pourquoi vous auriez besoin de la SCRO pour accéder à un cross-origin resource sur un autre port.split('/', 1)
.-
dans le nom d'hôte. Merci pour le downvote sur un mineur de cas de bord dans le deuxième la solution que j'ai fournis.Si vous envisagez une URL, étant externe si le schéma, l'hôte ou le port est différente, vous pourriez faire quelque chose comme ceci:
location.protocol
oulocation.host
que ce que j'attendais. Quelles sont leurs valeurs dans votre cas?undefined
si un sous-masque a été ignoré, mais il renvoie une chaîne vide.foojsfiddle.net/bar.html
J'ai été en utilisant psuedosavant de la méthode, mais a couru dans les quelques cas où il a déclenché des faux positifs, tels que domain-moins de liens (
/about
,image.jpg
) et les liens d'ancrage (#about
). L'ancienne méthode serait également donner des résultats inexacts pour les différents protocoles (http
vshttps
).Voici ma version légèrement modifiée:
Voici quelques tests avec la mise à jour de la fonction:
Il est plus précis dans l'ensemble, et il a même finit par être légèrement plus rapide, selon certains de base jsperf tests. Si vous laissez au large de la
.toLowerCase()
pour la casse, les tests, vous pouvez l'accélérer encore plus.isExternal
:( url.indexOf(':') > -1 || url.indexOf('//') > -1 )
, vous devriez être en mesure d'obtenir les résultats que vous voulez.pseudosavant la réponse n'a pas vraiment fonctionné pour moi, j'ai donc amélioré.
http(s)
.url
etlocation
.!(... === ...)
au lieu de!==
?J'ai dû construire sur pseudosavant et de Jon réponses, car j'ai besoin d'attraper cas des Url commençant par "//" et les Url qui ne comprennent pas un sous-domaine. Voici ce qui a fonctionné pour moi:
JS:
HTML:
Pour mon but, j'ai juste fait une petite modification à shshaw la réponse de vérifier si les liens ne sont pas vides ou juste un seul caractère (en supposant que ce '#'), qui origine de réponse de la méthode renvoie false positive. C'était mon but d'indiquer aux utilisateurs qu'ils vont quitter ma page en y ajoutant de la FA icône.
Ne devrait pas
faire l'affaire? Ne fonctionne pas pour absolue (interne) url.
Le principal problème, est de savoir comment analyser une URL, et d'obtenir un nom d'hôte notre de il.
Il peut être fait avec la manière suivante:
Ou vous pouvez utiliser est-url-externe module.
Vous pouvez simplement utiliser npm paquet est-interne-lien
Installation
Utilisation
J'ai aussi souvent ce à réagir comme ça
Avertissement: je suis l'auteur de cette lib