2011-05-30 18 views
15

sto chiamando l'URL base tramite javascript in una pagina html e voglio aggiungere l'URL di base per chiamare un linkgetBaseURL() funzione JavaScript chiamata a href = ""

ad es.

<a href="getBaseURL()/filepath/index.html">Page</a> 

Il javascript è il seguente:

function getBaseURL() { 
    var url = location.href; // entire url including querystring - also: window.location.href; 
    var baseURL = url.substring(0, url.indexOf('/', 14)); 

    if (baseURL.indexOf('http://localhost') != -1) { 
     // Base Url for localhost 
     var url = location.href; // window.location.href; 
     var pathname = location.pathname; // window.location.pathname; 
     var index1 = url.indexOf(pathname); 
     var index2 = url.indexOf("/", index1 + 1); 
     var baseLocalUrl = url.substr(0, index2); 

     return baseLocalUrl + "/"; 
    } 
    else { 
     // Root Url for domain name 
     return baseURL + "/"; 
    } 

} 

EDIT

Il suo solo per ottenere qualsiasi URL di base del dominio in questione. Inoltre, ho ottenuto questo codice da un tutorial in modo tutti i suggerimenti che richiedono meno elaborazione sarebbe grande grazie

SECONDO EDIT

Ciao a tutti grazie per le vostre risposte finora, però, sto cercando di chiamare il funzione per il tag html come in <a href="getURL()/filepath/file.html></a>. Questo è dove sta il problema, non sono sicuro come fare

+0

Hai una domanda? Btw, 'localhost0' e' localhost.foo.com' sono domini perfettamente validi e non quelli che sono tipicamente trattati specialmente in/etc/hosts o altre configurazioni di risoluzione dei nomi, quindi il tuo "" http: // localhost "=== baseUrl .substring (0, 14) 'ha un sacco di ipotesi nascoste. Stai anche ignorando l'effetto di un ''. –

+1

Puoi fornire un URL di esempio e che cosa potrebbe essere "baseURL"? Ho la sensazione che tu faccia un sacco di elaborazione non necessaria ... –

+0

per favore definisci "baseURL" –

risposta

30
function getBaseURL() { 
    return location.protocol + "//" + location.hostname + 
     (location.port && ":" + location.port) + "/"; 
} 

Edit: È stato risolto il punto di Mike Samuel su porte non standard.

+2

Se c'è un percorso più di un livello di directory in profondità, una porta non standard o un elemento '' nel documento, questo è sbagliato. –

+1

@Mike Samuel: Non sono sicuro di capire cosa intendi per percorso più di un livello di directory, ma "" e le porte non standard per i siti pubblici sono usate raramente (in realtà, non penso di averlo * mai * visto il tag 'base' in pratica). Ha anche dichiarato che voleva "ottenere l'URL di base dalla domanda del dominio". Se stessimo creando questa funzione per una biblioteca, terrei conto di tutti i minimi dettagli coinvolti. Ma dal momento che non lo sono, penso che userò il rasoio di Occam e presumo che abbia la stessa configurazione del 95% dei siti su Internet. –

+3

forse le tue asserzioni sugli ambienti comuni sono corrette, ma fornire codice semplificato su un forum di aiuto senza avvertimenti è una cattiva pratica. Se sai che fallisce in certe situazioni menzionalo nei commenti. Per directory, l'URL di base per 'http: // example.com/foo/bar.html' (assente un override da' ') è' http: // example.com/foo/', non' http:// example.com/'. –

5

Una soluzione generale per consentire l'uso di <base> (o meno) - un ulteriore miglioramento sarebbe quello di rimuovere BaseDocument da baseURL utilizzando una sorta di regex.

function getBaseURL() { 
    var baseURL = ""; 
    var baseDocument = "index.html"; 

    if (document.getElementsByTagName('base').length > 0) { 
     baseURL = document.getElementsByTagName('base')[0].href.replace(baseDocument, ""); 
    } else { 
     baseURL = location.protocol + "//" + location.hostname + (location.port && ":" + location.port) + "/"; 
    } 

    return baseURL; 
} 
0

ho a che fare con lo stesso problema, e non è così tanto ottenendo l'URL di base (come queste risposte hanno dimostrato), ma chiamando che funzione javascript dall'elemento e poi l'aggiunta di un percorso relativo. Utilizzando @Christian Sanchez risposta e altre informazioni che ho trovato, questa è un'opzione utilizzando l'onclick dell'elemento:

JavaScript:

<script type="text/javascript"> 
    function getBaseURL(loc) { 
     return location.protocol + "//" + location.hostname + 
      (location.port && ":" + location.port) + "/" + loc; 
    } 
</script> 

HTML:

<a href="filepath/index.html" onclick="getBaseURL(this.href);">TEST LINK</a> 

Fiddle è qui: http://jsfiddle.net/62g2bkyh/ (passa il mouse sopra il link per vedere l'URL in fiddle - che mostra l'URL di base di iframe).

Problemi correlati