150 votes

URL relative à un numéro de port différent dans un lien hypertexte ?

Existe-t-il un moyen, sans Javascript / script côté serveur, de se connecter à un numéro de port différent sur la même machine, si je ne connais pas le nom d'hôte ?

par exemple :

<a href=":8080">Look at the other port</a>

(Cet exemple ne fonctionne pas car il traitera simplement :8080 comme une chaîne vers laquelle je veux naviguer).

0 votes

0 votes

Parce que beaucoup de gens en dessous se sont empilés avec des solutions côté serveur, le NGINX $http_host var fonctionne, par exemple : return 200 '<html><body><iframe id="ic" src="http://$http_host:2812/"></iframe></body></html> c'est-à-dire dans un /etc/nginx/conf.d/strange.conf fichier.

100voto

Craig McQueen Points 13194

Que dites-vous de ça ?

Modifiez le numéro de port sur le clic :

<a href="http://stackoverflow.com/other/" onclick="javascript:event.target.port=8080">Look at another port</a>

Cependant, si vous passez votre souris sur le lien, il ne montre pas le lien avec le nouveau numéro de port inclus. Ce n'est que lorsque vous cliquez dessus que le numéro de port est ajouté. De même, si l'utilisateur clique avec le bouton droit de la souris sur le lien et fait "Copier l'emplacement du lien", il obtient l'URL non modifiée sans le numéro de port. Ce n'est donc pas l'idéal.

Voici une méthode permettant de modifier l'URL juste après le chargement de la page, de sorte que le fait de passer la souris sur le lien ou de cliquer sur "Copy Link Location" permet d'obtenir l'URL mise à jour avec le numéro de port :

<html>
<head>
<script>
function setHref() {
document.getElementById('modify-me').href = window.location.protocol + "//" + window.location.hostname + ":8080/other/";
}
</script>
</head>

<body onload="setHref()">
<a href="http://stackoverflow.com/other/" id="modify-me">Look at another port</a>
</body>
</html>

0 votes

Merci d'avoir souligné les réserves, dont j'étais conscient. Dans ma situation, les réserves ne sont pas très importantes, et je préfère la simplicité de votre première solution. J'étais presque certain d'avoir déjà validé votre réponse, mais le logiciel semble penser que non, et la mémoire du logiciel est probablement plus fiable que la mienne. Je l'ai donc upvoted (encore ??).

0 votes

J'ai résolu le mystère : j'ai accidentellement upvoted une des autres réponses à la place. Oups. Je n'ai pas assez de réputation pour annuler mon upvote accidentel.

0 votes

<a href="#" onclick="javascript:event.target.port=8888">port 8888</a> ne devrait techniquement pas fonctionner, selon spécifications w3 . event.target est censé être readonly . Mais cela semble fonctionner pour moi dans Chrome et Firefox !

60voto

Kurt Schultz Points 101

Vous pouvez le faire facilement en utilisant document.write et l'URL s'affichera correctement lorsque vous la survolerez. Vous n'avez pas non plus besoin d'un identifiant unique avec cette méthode et elle fonctionne avec Chrome, FireFox et IE. Étant donné que nous ne faisons référence qu'à des variables et que nous ne chargeons pas de scripts externes, l'utilisation de document.write n'aura aucune incidence sur les performances de chargement des pages.

<script language="JavaScript">
document.write('<a href="' + window.location.protocol + '//' + window.location.hostname + ':8080' + window.location.pathname + '" >Link to same page on port 8080:</a> ' );
</script>

3 votes

Simple et élégant ! Je ne sais pas pourquoi il n'y a pas plus de votes positifs - peut-être que c'est juste un retardataire.

7 votes

Notez également qu'il n'est pas nécessaire d'inclure les éléments suivants window.location.protocol partie, en commençant par '//' .

0 votes

Semble légitime. Élégant.

54voto

Gary Hole Points 9736

Ce serait bien si ça pouvait marcher, et je ne vois pas pourquoi ça ne marcherait pas parce que : est un caractère réservé pour la séparation des ports à l'intérieur du composant URI. Le navigateur pourrait donc, de manière réaliste, l'interpréter comme un port relatif à cette URL, mais malheureusement il ne le fait pas et il n'y a aucun moyen pour lui de le faire.

Vous aurez donc besoin de Javascript pour le faire ;

// delegate event for performance, and save attaching a million events to each anchor
document.addEventListener('click', function(event) {
  var target = event.target;
  if (target.tagName.toLowerCase() == 'a')
  {
      var port = target.getAttribute('href').match(/^:(\d+)(.*)/);
      if (port)
      {
         target.href = window.location.origin;
         target.port = port[1];
      }
  }
}, false);

Testé dans Firefox 4

Violon : http://jsfiddle.net/JtF39/79/


Mise à jour : Correction du bogue pour l'ajout du port à la fin de l'url et ajout de la prise en charge des urls relatives et absolues à ajouter à la fin :

<a href=":8080/test/blah">Test absolute</a>
<a href=":7051./test/blah">Test relative</a>

1 votes

Donc sans javascript il n'y a pas de vraie solution

2 votes

Il n'y a aucun moyen de le faire sans Javascript.

7 votes

Cela n'a pas fonctionné dans Safari 6. Le problème est que vous ne supprimez pas le port de l'url relative, ce qui donne quelque chose comme http://myhost:8080/:8080 pour href=":8080" . Vous pouvez ajouter cette ligne sous ` target.port = port[1];` pour résoudre ce problème. target.href = target.href.replace("/:"+target.port, ""); (Ce n'est pas une solution parfaite, puisqu'il s'agit d'une recherche/remplacement, mais c'est bon pour les cas simples où vous n'êtes pas inquiet que la chaîne de port soit dans l'URL).

5voto

gdt Points 524

Sans JavaScript, vous devrez recourir à des scripts côté serveur. Par exemple, si vous utilisez ASP, quelque chose comme ...

<a href="<%=Request.ServerVariables("SERVER_NAME")%>:8080">Look at the other port</a>

devrait fonctionner. Toutefois, le format exact dépendra de la technologie que vous utilisez.

2voto

MUY Belgium Points 513

Pas besoin de javascript compliqué : il suffit d'insérer un nœud script après votre ancre, puis de récupérer le nœud en javascript, et de modifier son href avec la propriété fenêtre.emplacement.origine méthode.

 <a id="trans">Look at the other port</a>
 <script>
      document.getElementById('trans').href='http://'+window.location.origin+':8081';
 </script>

La propriété id doit être unique à l'échelle de la page, vous pouvez donc utiliser une autre méthode pour récupérer les objets de nœuds.

Testé avec apache et Firefox sur Linux.

0 votes

Pour une raison quelconque, cela n'a pas fonctionné pour moi - il a dirigé le navigateur à http//localhost:8081 Notez les deux points manquants. J'ai simplement supprimé la partie "protocole" puisque Chrome suppose que c'est http de toute façon.

0 votes

Comment l'avez-vous testé ?

1 votes

Je pense que cela devrait être window.location.hostname à la place. Voir developer.mozilla.org/fr/US/docs/Web/API/Location

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