2010-04-15 7 views
6

J'ai une fonction onclick que je veux ajouter une ancre à la valeur href. Je ne veux pas changer l'URL, car j'ai besoin que le site fonctionne toujours pour les personnes sans javascript/à des fins de référencement. alors voici ce que j'ai essayé d'utiliser (amoung autres):jQuery réécriture href

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

Un lien orginal ressemble à ceci:

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

URL re-écriture devrait ressembler à ceci, de sorte que AJAX fonctionne:

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

j'ai pu se rendre au travail en définissant une valeur de nom de liens URL de certains à la même chose que le href, mais il ne fonctionne pas pour les liens avec les sous-sections:

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

Donc, pas vraiment sûr. Merci pour l'aide.

+0

Quelle devrait être la re-écriture pour ressembler à un lien sous-section? –

Répondre

5

Je vous suggère d'utiliser des expressions régulières, comme

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

C'est la solution parfaite. Cela m'a permis de garder toutes les url d'origine et seulement l'ajax ajl modifié en clic. Le résultat final était comme ceci: "http://www.monsite.com/#PopularTags". Juste ce dont j'avais besoin. J'espère que cela fonctionnera pour tous mes autres liens. Comment cela traitera-t-il une URL comme celle-ci: "http://www.monsite.com/Section1/Section2/"? –

+0

Je viens de me rendre compte que si vous cliquez sur un lien déjà actif, il continue d'ajouter des ancres.Alors, comment l'empêcherais-je d'ajouter des ancres s'il en existe déjà une? –

+0

@ brandon14_99 Ne changez pas les attributs 'href' à chaque fois que vous cliquez sur le lien, faites-le une seule fois lors du chargement du document. Remplacez '.click()' par '.each()' et cela devrait fonctionner. –

0

Je crois que quelque chose comme

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

fera le travail. Lire comme: Au chargement de la page, parcourez tous vos liens et remplacez leurs attributs href par # {old href}.

+0

Vous pouvez définir 'this.href' à la place de' $ (this) .attr ('href') '. JavaScript natif de ftw! (Vous aurez toujours besoin de '$ (this) .attr ('href')' pour _get_ l'attribut 'href' réel, cependant.) –

+0

Ceci a ajouté le symbole" # ", mais le lien original est apparu après. Le résultat final était comme ceci: "http://www.monsite.com/#/PopularTags/" –

4

Cela dépend de la façon dont vous codez vos liens dans le code HTML. Si vous liez à http://www.mysite.com/PopularTags/ en utilisant ceci:

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

Vous pouvez simplement utiliser ceci:

$(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 (‘/’) 
}); 
}); 

Cela se traduira par le code HTML suivant:

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

Notez que nous pouvons définir this.href au lieu de $(this).attr('href'), mais nous avons toujours besoin de ce dernier pour obtenir l'attribut réel href. this.href contient toujours un URI complet, y compris le protocole, le nom de domaine, etc - que nous ne voulons pas dans cet exemple.

+0

Cela a été un peu glitchy si le href n'a pas eu des barres obliques avant et arrière de l'URL, sinon aurait été une bonne solution. –

+0

@ brandon14_99 Dans votre question vous dites: "Un lien original ressemble à ceci:' http: // www.mysite.com/PopularTags/'" Donc j'ai supposé que vous seriez cohérent sur l'ensemble du site et codez tous les liens comme ça . Si vous voulez de la flexibilité avec des barres obliques, utilisez plutôt une expression régulière. –