Comment obtenir l'URL de base avec jquery ou javascript?


152

Dans joomla php, je peux utiliser $this->baseurlpour obtenir le chemin de base, mais je voulais obtenir le chemin de base dans jquery.

Le chemin de base peut être l'un des exemples suivants:

http://www.example.com/
http://localhost/example
http://www.example.com/sub/example

Le examplepeut également changer.



@Mritunjay J'ai déjà vu cela, mais dans mon cas, le chemin de base est différent car je souhaitais obtenir le chemin de base comme en php que nous faisons dans joomla
Navin Rauniyar

Alors, aucune des réponses n'a résolu votre problème?
Artjom B.

choisissez une réponse, s'il vous plaît?
allanberry

Réponses:


177

Celui-ci vous aidera ...

var getUrl = window.location;
var baseUrl = getUrl .protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];

Oui cela fonctionne! http://localhost/myapp/what/ever/sub/folder-> getBaseUrl -> http://localhost/myapp:-)
vee le

3
Cela ne fonctionnera pas dans tous les cas, comme indiqué par la réponse sous-notée de @Artjom B.Par exemple, lorsqu'un site est testé sur le réseau local (et que le domaine est remplacé par IP + chemin local), l'URL de base pourrait être quelque chose comme 192.168.0.23/~sites/site/html/au lieu de site.dev. Obtenir le chemin complet avec Javascript n'est pas non plus une option, car un site peut avoir n'importe quel nombre de sous-répertoires virtuels.
certainementakey

124

Je pense que ça ira pour toi

var base_url = window.location.origin;

var host = window.location.host;

var pathArray = window.location.pathname.split( '/' );

7
Joli court et doux, merci. window.location.origin
TetraDev

1
cela devrait être la réponse préférée, car elle est courte, concise et fonctionne bien.
Gregor

window.location.origin n'est pas défini dans ie9
jnoreiga

1
@jnoreiga Qui utilise encore ie9 ツ
Alexandre Daubricourt

2
J'aurais aimé que ce soit aussi simple que ça @AlexandreDaubricourt
jnoreiga

30

Cela obtiendra l'URL de base

var baseurl = window.location.origin+window.location.pathname;

c'est la même chose que window.location.href
Z. Khullah

8
ce n'est pas la même chose, pathname vous donne le segment de chemin de l'url, href contient également les paramètres de requête
dschulten

24

C'est une question extrêmement ancienne, mais voici les approches que j'utilise personnellement ...

Obtenir l'URL standard / de base

Comme beaucoup l'ont déjà dit, cela fonctionne dans la plupart des situations.

var url = window.location.origin;


Obtenir l'URL de base absolue

Cependant, cette approche simple peut être utilisée pour supprimer tout numéro de port.

var url = "http://" + location.host.split(":")[0];

Edit: Pour répondre au problème, posé par Jason Rice , ce qui suit peut être utilisé pour insérer automatiquement le type de protocole correct ...

var url = window.location.protocol + "//" + location.host.split(":")[0];


Définir l'URL de base

En prime, l'URL de base peut ensuite être redéfinie globalement.

document.head.innerHTML = document.head.innerHTML + "<base href='" + url + "' />";

1
À moins que votre protocole ne soit autre que http comme https (alors définir le protocole url sur "http: //" présentera des erreurs vraiment étranges en fonction de la façon dont vous souhaitez utiliser l'url).
Jason Rice

13

Ce n'est pas possible à partir de javascript, car il s'agit d'une propriété côté serveur. Javascript sur le client ne peut pas savoir où joomla est installé. La meilleure option est d'inclure d'une manière ou d'une autre la valeur de $this->baseurldans la page javascript, puis d'utiliser cette valeur ( phpBaseUrl).

Vous pouvez ensuite créer l'URL comme ceci:

var loc = window.location;
var baseUrl = loc.protocol + "//" + loc.hostname + (loc.port? ":"+loc.port : "") + "/" + phpBaseUrl;

1
Notez que loc.hostle port, pour une URL comme http://localhost:8082/cette méthode produira http://localhost:8082:8082/, window.location.hostnamedoit être utilisé à la place.
Tiberiu C.

@TiberiuC. Merci, ajouté.
Artjom B.


9

J'ai eu le même problème il y a quelque temps, mon problème était que j'avais simplement besoin de l'URL de base. Il y a beaucoup d'options détaillées ici, mais pour contourner cela, utilisez simplement l' window.locationobjet. En fait, tapez ceci dans la console du navigateur et appuyez sur Entrée pour sélectionner vos options. Eh bien pour mon cas, c'était simplement:

window.location.origin

7
var getUrl = window.location;
var baseurl = getUrl.origin; //or
var baseurl =  getUrl.origin + '/' +getUrl.pathname.split('/')[1]; 

Mais vous ne pouvez pas dire que le baseurl () de CodeIgniter (ou php joomla) retournera la même valeur, car il est possible de changer le baseurl dans le fichier .htaccess de ces frameworks.

Par exemple :

Si vous avez un fichier .htaccess comme celui-ci dans votre hôte local:

RewriteEngine on
RewriteBase /CodeIgniter/
RewriteCond $1 !^(index.php|resources|robots.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

Le $ this-> baseurl () renverra http: // localhost / CodeIgniter /


6

J'ai rencontré ce besoin sur plusieurs projets Joomla. Le moyen le plus simple que j'ai trouvé pour traiter est d'ajouter un champ de saisie masqué à mon modèle:

<input type="hidden" id="baseurl" name="baseurl" value="<?php echo $this->baseurl; ?>" />

Quand j'ai besoin de la valeur en JavaScript:

var baseurl = document.getElementById('baseurl').value;

Pas aussi sophistiqué que d'utiliser du JavaScript pur mais simple et fait le travail.


6

le moyen le plus simple d'obtenir l'URL de base dans jQuery

window.location.origin

Ce n'est en fait pas jQuery. jQuery ressemble à ceci: $ (emplacement) .attr ("origine");
Mauritz Hansen

3

Je recommanderais à tout le monde de créer une balise de base HTML en développement, puis d'attribuer le href dynamiquement, donc en production quel que soit l'hôte utilisé par un client, il s'y ajoutera automatiquement:

<html>
 <title>Some page title</titile>
  <script type="text/javascript">
    var head  = document.getElementsByTagName('head')[0];
    var base = document.createElement("base");
    base.href = window.document.location.origin;
    head.appendChild(base);
  </script>
 </head>
 ...

Donc si vous êtes dans localhot: 8080, vous accéderez à chaque fichier lié ou référencé depuis la base, par exemple: http://localhost:8080/some/path/file.html Si vous êtes dans www.example.com, ce serahttp://www.example.com/some/path/file.html

Notez également que, à chaque emplacement sur lequel vous vous trouvez, vous ne devez pas utiliser de références comme les globs dans hrefs, par exemple: L'emplacement parent http://localhost:8080/ne cause pas http://localhost:8080/some/path/.

Prétendez que vous référencez tous les liens hypertexte comme condamnés complets sans l'URL bas.


3

Le format est nom d'hôte / chemin / recherche

Donc, l'URL est:

var url = window.location.hostname + window.location.pathname + window.location.hash

Pour votre cas

window.location.hostname = "stackoverflow.com"
window.location.pathname ="/questions/25203124/how-to-get-base-url-with-jquery-or-javascript"
window.location.hash = ""

Donc, fondamentalement, le baseurl = hostname = window.location.hostname


3

Je suis surpris qu'aucune des réponses ne considère l'URL de base si elle était définie dans <base>tag. Toutes les réponses actuelles tentent d'obtenir le nom d'hôte ou le nom du serveur ou la première partie de l'adresse. C'est la logique complète qui considère également la <base>balise (qui peut faire référence à un autre domaine ou protocole):

function getBaseURL(){
  var elem=document.getElementsByTagName("base")[0];
  if (typeof(elem) != 'undefined' && elem != null){
     return elem.href;
  }
  return window.location.origin;
}

Format Jquery:

function getBaseURL(){
  if ($("base").length){
     return $("base").attr("href");
  }
  return window.location.origin;
}

Sans s'impliquer dans la logique ci-dessus, la solution abrégée qui considère à la fois <base>tag et window.location.origin:

Js:

var a=document.createElement("a");
a.href=".";
var baseURL= a.href;

Jquery:

var baseURL= $('<a href=".">')[0].href

Note finale: pour un fichier local sur votre ordinateur (pas sur un hôte), le window.location.originseul retourne le file://mais la solution de tri ci-dessus renvoie le chemin complet correct.


1
Ce n'est pas la meilleure façon. Voir également la réponse de @ DaniilSamoylov, qui intègre l' <base>élément.
Brad

baseURI renvoie l'URL de base d'un nœud donc dans ce cas, elle renvoie le chemin de base + le nom du document. vous aurez besoin de plus de codes pour supprimer le nom du document de cette URL. @Brad
Ali Sheikhpour

Cette solution ne pas rendre l'URL de base correcte lorsque le répertoire racine de la page Web se trouve dans un sous - répertoire (par exemple example.com/appRoot ). Cela ne fonctionne que lorsque le répertoire racine de la page Web est directement situé à la racine de l'hôte Web.
Michael Hafner

2
window.location.origin+"/"+window.location.pathname.split('/')[1]+"/"+page+"/"+page+"_list.jsp"

presque la même que la réponse de Jenish mais un peu plus courte.


2

J'étais juste sur la même scène et cette solution fonctionne pour moi

Dans la vue

<?php
    $document = JFactory::getDocument();

    $document->addScriptDeclaration('var base = \''.JURI::base().'\'');
    $document->addScript('components/com_name/js/filter.js');
?>

Dans le fichier js, vous accédez en basetant que variable par exemple dans votre scénario:

console.log(base) // will print
// http://www.example.com/
// http://localhost/example
// http://www.example.com/sub/example

Je ne me souviens pas où je prends cette information pour donner crédit, si je la trouve, je modifierai la réponse


1
var getUrl = window.location;
var baseUrl = getUrl .protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];

1
Veuillez envisager d'ajouter une description à votre réponse.
Capricorne

1

Voici quelque chose de rapide qui fonctionne également avec les file://URL.

Je suis venu avec ce one-liner:

[((1!=location.href.split(location.href.split("/").pop())[0].length?location.href.split(location.href.split("/").pop())[0]:(location.protocol,location.protocol+"//" + location.host+"/"))).replace(location.protocol+"//"+location.protocol+"//"+location.protocol+"://")]

0

Vous avez mentionné que le example.compeut changer, donc je soupçonne qu'en fait vous avez besoin de l'URL de base juste pour pouvoir utiliser la notation de chemin relatif pour vos scripts. Dans ce cas particulier, il n'est pas nécessaire d'utiliser le script - ajoutez plutôt la balise de base à votre en-tête:

<head>
  <base href="http://www.example.com/">
</head>

Je génère généralement le lien via PHP.


0

Au cas où quelqu'un voudrait voir cela divisé en une fonction très robuste

    function getBaseURL() {
        var loc = window.location;
        var baseURL = loc.protocol + "//" + loc.hostname;
        if (typeof loc.port !== "undefined" && loc.port !== "") baseURL += ":" + loc.port;
        // strip leading /
        var pathname = loc.pathname;
        if (pathname.length > 0 && pathname.substr(0,1) === "/") pathname = pathname.substr(1, pathname.length - 1);
        var pathParts = pathname.split("/");
        if (pathParts.length > 0) {
            for (var i = 0; i < pathParts.length; i++) {
                if (pathParts[i] !== "") baseURL += "/" + pathParts[i];
            }
        }
        return baseURL;
    }

Cela donne juste l'URL entière. Pas une URL de base.
Sam

en fait, je ne sais pas où j'allais avec cela. Je suis depuis longtemps passé à la configuration avec le code côté serveur
nuander

0

Facile

$('<img src=>')[0].src

Génère une image avec un nom src vide force le navigateur à calculer l'URL de base par lui-même, peu importe si vous avez /index.htmlou quoi que ce soit d'autre.


Cela semble la solution la plus élégante de toutes et la seule qui ne duplique pas la logique du navigateur, ce qui est bien. Je me demande à quel point il est portable. Y a-t-il quelque chose dans les spécifications HTML suggérant que cela fonctionne dans tous les navigateurs?
Matthijs Kooijman

@MatthijsKooijman Dépend de l'interprétation des spécifications html. Si vous dites qu'un nom de fichier de longueur 0 est un nom de ressource valide ... il correspond à tous les navigateurs.
Grim

Comprenez comment les navigateurs sont créés. Vous avez un couple de programmeurs, le souhait (indirect) de construire un navigateur. Leur première source est les spécifications html. Ils lisent les spécifications et c'est l'une des questions qu'ils aiment vraiment résoudre. Comment penseriez-vous qu'ils (tous) décident de ces circonstances?
Grim

-2

Divisez et rejoignez l'URL:

const s = 'http://free-proxy.cz/en/abc'
console.log(s.split('/').slice(0,3).join('/'))

-4

Mettez-le dans votre en-tête, il sera donc disponible chaque fois que vous en aurez besoin.

var base_url = "<?php echo base_url();?>";

Vous obtiendrez http://localhost:81/your-path-fileou http://localhost/your-path-file.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.