2010-04-14 13 views
21

Me gustaría obtener una confirmación sobre algún punto.Obtenga el URI completo de la propiedad href de un enlace

Mi objetivo es obtener siempre la misma cadena (que es el URI en mi caso) al leer la propiedad href desde un enlace. Ejemplo:

<a href="test.htm" /> con base_url = http://domain.name/

<a href="../test.htm" /> con base_url = http://domain.name/domain/

<a href="http://domain.name/test.htm" /> con base_url = cualquier carpeta de http://domain.name/

Necesito conseguir http://domain.name/test.htm de los 3 situaciones anteriores (o cualquier otro cuerda idéntica).

Después de algunas pruebas, parece que my_a_dom_node.href siempre devuelven el URI completo, incluido el http://domaine.name, que debería estar bien para lo que quiero.

jQuery tiene un comportamiento diferente y $(my_a_dom_node).attr('href') devuelve el contenido (texto) que aparece dentro del HTML. Entonces mi truco es usar $(my_a_dom_node).get(0).href para obtener el URI completo.

La pregunta es: ¿puedo confiar en esto?

+3

BTW: '$ (my_a_dom_node) .get (0) .href' ==' $ (my_a_dom_node) [0] .href' – Tomalak

Respuesta

21

SÍ, puede confiar!

Una vez que las personas usaban javascript (no jQuery) muchos preguntaban lo contrario de lo que preguntaban, querían obtener la url real como está escrita en el atributo href y no en el completo, en tal caso solían Basta con hacer:

my_a_dom_node.getAttribute('href', 2); //works both IE/FF 

y sucedió jQuery que ayudó a la gente a no perder su tiempo en descubrir que necesitarían dicho código y jQuery siempre devuelve la URL real como está escrito en el atributo href.

Es curioso que ahora alguien esté preguntando cómo obtener la url completa porque jQuery devuelve la que está escrita en el atributo href.

+0

Sí, encontré las preguntas de las que está hablando cuando escribí mi pregunta. Gracias por la respuesta. – Savageman

+0

¿Por qué está suministrando un segundo argumento de valor '2'? 'getAttribute' solo tiene un argumento. – Noitidart

+0

@Noitidart: getAttribute viene con dos argumentos, el segundo argumento es opcional: http://msdn.microsoft.com/en-us/library/ms536429(v=vs.85).aspx –

1

Usted puede recomponer la URL completa con un poco de javascript:

function parseLink(link) { 
    var baseUrl = location.href.substring(0,location.href.lastIndexOf('/')); 
    if (link.indexOf('/') != -1) { 
     link = link.substring(link.lastIndexOf('/')); 
    } else { 
     link = "/"+ link; 
    } 
    var fullUrl = baseUrl + link; 
    return fullUrl 
} 
+0

¿Eso realmente funcionaría para CUALQUIER subcarpeta y ruta relativa? Desde mi entendimiento, no es el caso. – Savageman

+0

Creo que sí, lo básico es bastante sencillo. ¿Tal vez alguien me pruebe mal? – rnaud

+0

No funciona en subcarpetas –

10

Sí, puede confiar en esto.

Mirando a través de la (1.4.2) el código fuente jQuery, veo la función jQuery.attr() se está utilizando (condensado a las partes pertinentes):

jQuery.extend({ 
    // ... 
    attr: function(elem, name, value, pass) { 
    // ... 

    var attr = !jQuery.support.hrefNormalized && notxml && special ? 
       // Some attributes require a special call on IE 
       elem.getAttribute(name, 2) : 
       elem.getAttribute(name); 

    // Non-existent attributes return null, we normalize to undefined 
    return attr === null ? undefined : attr;  
    } 
}); 

para que las llamadas it'effectively elem.getAttribute('href') que devuelve el valor del atributo real , mientras que la propiedad href, por diseño, devuelve la URL canónica.

Sin embargo, hay una referencia a jQuery.support.hrefNormalized, de los cuales el sitio de soporte de jQuery tiene que decir:

  • hrefNormalized: es igual a true si el método .getAttribute() recupera el atributo href de elementos sin cambios , en lugar de normalizarlo a una URL totalmente calificada. (Es actualmente falso en IE, las URL son normalizadas). especificación DOM L3

Esto significa básicamente que jQuery se entera de comportamiento del navegador en sí mismo y se adapta a ellos para proporcionar un resultado consistente.

+0

Genial, gracias por la respuesta. Ojalá pudiera dar 2 awser aceptado aquí. Yo voté a Marco Demaio, porque él fue el primero y básicamente digo lo mismo. – Savageman

+0

@Savageman: Sí ... me llevó un tiempo hurgar en el código fuente. ;) – Tomalak

10

Sé que es una vieja pregunta, pero siendo esta la primera entrada que apareció, creo que es bueno agregar una solución extra. Desde jQuery introdujo la función de "apuntalar", para obtener el URL completo es tan simple como:

$(my_a_dom_node).prop('href'); 

espero que todavía ayuda a alguien.

Cuestiones relacionadas