2010-04-15 11 views
6

Tengo una función onclick que quiero agregar un anclaje al valor href. No quiero cambiar las URL, porque necesito que el sitio siga funcionando para personas sin Javascript/con fines de SEO. Así que aquí es lo que he intentado usar (amoung otras cosas):jQuery rewrite href

 
jQuery('a[rel=ajax]').click(function() { 
    jQuery(this).attr('href', '/#' + jQuery('a')); 
}); 

Un enlace original es el siguiente:

http://www.mysite.com/PopularTags/

URL re-escritura debe tener este aspecto, por lo que AJAX funcionará:

http://www.mysite.com/#PopularTags

que era capaz de conseguir algunos de URL para trabajar mediante el establecimiento de un valor de nombre enlaces a la misma que la href, pero no funcionó para los enlaces con subsecciones:

http://www.mysite.com/Artist/BandName/

Así que no estoy del todo seguro. Gracias por la ayuda.

+0

Cuál debe ser la re-escritura para parecerse a un enlace subsección? –

Respuesta

5

me gustaría sugerir a utilizar expresiones regulares, como

$('a[rel=ajax]').click(function(){ 
    $(this).attr('href', function(){ 
    this.href = this.href.replace(/\/$/, ""); 
    return(this.href.replace(/(.*\/)/, "$1#")); 
    }); 
}); 
+0

Esta es la solución perfecta. Me permitió conservar todas las URL originales y solo las URL de ajax relevantes cambiaron al hacer clic. El resultado final fue así: "http://www.misitio.com/#PopularTags". Justo lo que necesitaba. Espero que funcione para todos mis otros enlaces. ¿Cómo manejará esto una URL como esta: "http://www.misitio.com/Sección1/Sección2/"? –

+0

Me acabo de dar cuenta de que si hace clic en un enlace que ya está activo, sigue agregando anclas ...Entonces, ¿cómo evitaría que agregue anclajes si ya existe uno? –

+0

@ brandon14_99 No cambie los atributos 'href' cada vez que se hace clic en el enlace, solo hágalo una vez cuando cargue el documento. Reemplazar '.click()' con '.each()' y debería funcionar. –

0

creo que algo así como

jQuery(function(){ 
    jQuery('a').each(function(){ 
    jQuery(this).attr('href','/#'+jQuery(this).attr('href')); 
    }); 
}); 

hará el trabajo. Leer como: al cargar la página, recorre todos tus enlaces y reemplaza sus atributos href con # {old href}.

+0

Puede establecer 'this.href' en lugar de' $ (this) .attr ('href') '. JavaScript nativo ftw! (Sin embargo, todavía necesitará '$ (this) .attr ('href')' para _obtener el atributo 'href' real) –

+0

Esto agregó el símbolo" # ", pero el enlace original aún apareció después. El resultado final fue el siguiente: "http://www.misitio.com/#/PopularTags/" –

4

Depende de cómo codifique sus enlaces en el HTML. Si va a enlazar a http://www.mysite.com/PopularTags/ usar este:

<a href="/PopularTags/">Popular Tags</a> 

puede simplemente usar esto:

$(function() { 
$('a[rel=ajax]').each(function() { 
    var actualHref = $(this).attr('href'); 
    this.href = '/#' + actualHref.substring(1, actualHref.length - 1); // cuts off the first and last characters (‘/’) 
}); 
}); 

Esto resultará en el código HTML siguiente:

<a href="/#PopularTags">Popular Tags</a> 

Tenga en cuenta que podemos establecer this.href en lugar de $(this).attr('href'), pero aún necesitamos este último para obtener el atributo href real. this.href siempre contiene un URI completo, incluido el protocolo, nombre de dominio, etc., que no queremos en este ejemplo.

+0

Esto era un poco impreciso si el href no tenía barras en frente y detrás de la url, de lo contrario habría sido una buena solución –

+0

@ brandon14_99 En su pregunta usted dice: "Un enlace original se ve así:' http: // www.misitio.com/PopularTags/'" Así que asumí que sería coherente en todo el sitio y codificaría todos los enlaces como ese . Si desea flexibilidad con barras, use una expresión regular en su lugar. –

Cuestiones relacionadas