2011-05-30 23 views
15

Estoy llamando a la url a través de JavaScript basado en una página html y quiero añadir la URL base para llamar a un enlacegetBaseURL() de JavaScript llamada en un href = ""

por ejemplo.

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

El javascript es el siguiente:

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 + "/"; 
    } 

} 

EDITAR

Su sólo para obtener cualquier URL de base del dominio en cuestión. Además, tengo el código de un tutorial que cualquier sugerencia que requerirán menos procesamiento serían grandes gracias

SEGUNDA EDICIÓN

Hola a todos gracias por sus respuestas hasta el momento, sin embargo, estoy buscando a llamar a la función a la etiqueta html como en <a href="getURL()/filepath/file.html></a>. Aquí es donde radica el problema, no estoy seguro de cómo hacer eso

+0

¿Tiene una pregunta? Por cierto, 'localhost0' y' localhost.foo.com' son dominios perfectamente válidos y no los que se tratan especialmente en/etc/hosts u otras configuraciones de resolución de nombres, por lo que su '" http: // localhost "=== baseUrl .substring (0, 14) 'tiene una gran cantidad de suposiciones ocultas. También está ignorando el efecto de un ''. –

+1

¿Podría proporcionar un ejemplo de URL y qué 'baseURL' podría ser más que? Tengo la sensación de que usted hace un montón de procesos innecesarios ... –

+0

defina "baseURL" –

Respuesta

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

Editar: Resolvió el punto de Mike Samuel en los puertos no estándar.

+2

Si hay un camino con más de un nivel de directorio profundo, un puerto no estándar o un elemento '' en el documento, entonces esto está mal. –

+1

@Mike Samuel: No estoy seguro de entender lo que quiere decir con un camino de más de un nivel de directorio profundo, pero '' y los puertos no estándar para sitios públicos rara vez se usan (de hecho, no creo que haya * ever * visto la etiqueta 'base' en la práctica). También afirmó que quería "obtener la URL base de la pregunta del dominio". Si estuviera creando esta función para una biblioteca, tendría en cuenta todas las minucias involucradas. Pero como no lo estoy, creo que usaré la navaja de afeitar de Occam y asumiré que tiene la misma configuración que el 95% de los sitios en Internet. –

+3

quizás sus afirmaciones sobre entornos comunes sean correctas, pero proporcionar código simplificado en un foro de ayuda sin advertencias es una mala práctica. Si sabe que falla en ciertas situaciones, mencione eso en los comentarios. Según los directorios, la URL base para 'http: // example.com/foo/bar.html' (sin una anulación de' ') es' http: // example.com/foo/', no' http:// example.com/'. –

5

Una solución general para permitir el uso de <base> (o no) - una mejora adicional sería tener el baseDocument eliminado de la baseURL usando algún tipo de expresión regular.

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

estoy tratando con el mismo problema, y ​​no está recibiendo tanto la URL base (ya que estas respuestas han mostrado), pero pidiendo que la función JavaScript desde el elemento y luego añadir una ruta relativa. Usando @Christian Sánchez respuesta y otra información que he encontrado, esta es una opción mediante la onclick del 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> 

violín está aquí: http://jsfiddle.net/62g2bkyh/ (desplace el mouse sobre el enlace para ver la URL en el violín, que muestra la URL base del iframe).

Cuestiones relacionadas