142 votes

Obtenir l'emplacement du hachage de l'URL, et l'utiliser dans jQuery

Je voudrais obtenir la valeur après un hash dans l'URL de la page actuelle et ensuite pouvoir l'appliquer dans une nouvelle fonction... ex.

L'URL pourrait être

www.example.com/index.html#foo

Et je voudrais utiliser ceci en conjonction avec le morceau de code suivant

$('ul#foo:first').show();

Je suppose/espère qu'il existe un moyen de saisir cette information et de la transformer en une variable que je peux ensuite utiliser dans le deuxième morceau de code.

9 votes

Je n'ai pas de code pour vous, mais vous devriez vous assurer de nettoyer l'entrée, car cela semble mûr pour l'injection de code.

0 votes

Sachant que cette question date de presque dix ans, 'ul#foo:first' n'a pas de sens puisque les ID doit être unique, il faut donc ajouter :first au sélecteur est redondant, à moins que vous ne dupliquiez les ID, ce qui n'est pas valable. Notez que même il y a dix ans, les ID répétés étaient toujours invalides.

0 votes

C'était encore faux il y a dix ans

291voto

CMS Points 315406

Note de l'éditeur : l'approche ci-dessous a de sérieuses implications en matière de sécurité et, selon la version de jQuery que vous utilisez, peut exposer vos utilisateurs à des attaques XSS. Pour plus de détails, voir la discussion de l'attaque possible dans les commentaires de cette réponse ou cette explication sur Security Stack Exchange .

Vous pouvez utiliser le location.hash pour récupérer le hachage de la page actuelle :

var hash = window.location.hash;
$('ul'+hash+':first').show();

Notez que cette propriété contient déjà le # au début.

En fait, vous n'avez pas besoin de la :first étant donné que vous utilisez le pseudo-sélecteur Sélecteur d'identité On suppose que les ID sont unique dans le DOM.

Si vous souhaitez obtenir le hachage d'une chaîne d'URL, vous pouvez utiliser la fonction String.substring méthode :

var url = "http://example.com/file.htm#foo";
var hash = url.substring(url.indexOf('#')); // '#foo'

Conseil : Sachez que l'utilisateur peut changer le hachage comme il le souhaite, en injectant n'importe quoi dans votre sélecteur, vous devez vérifier le hachage avant de l'utiliser.

30 votes

Notez que les sélecteurs jQuery peuvent être utilisés pour exécuter du code javascript personnalisé. L'utilisation de hachages non sécurisés est donc très, très peu sûre. Les versions récentes de jQuery contiennent une correction partielle pour les sélecteurs qui contiennent un # avant le code injecté, mais vous courez toujours un risque si vous supprimez la marque # du début de location.hash. Par exemple. var hash = location.hash.slice(1); $('ul.item'+hash).show().append($('#content')); ceci exécutera une balise script placée dans le hash. C'est une bonne habitude d'utiliser $('body').find('ul'+hash+':first') au lieu de $('ul'+hash+':first') .

42 votes

Certains navigateurs renvoient le symbole de hachage, d'autres non, il est donc plus sûr de l'utiliser : var hash = location.hash.replace('#', '');

0 votes

@Tgr Lorsque vous dites que "l'utilisation de hachages non nettoyés est horriblement, horriblement peu sûre", pouvez-vous expliquer ce qui peut être fait ? S'agit-il d'un utilisateur qui pirate son propre ordinateur ? Je ne vois pas quelle est la véritable vulnérabilité et j'apprécierais vraiment d'en savoir plus.

36voto

Deepak Patil Points 456

location.hash n'est pas sûr pour IE Dans le cas d'IE (y compris IE9), si votre page contient une iframe, alors après un rafraîchissement manuel à l'intérieur de l'iframe, le contenu récupère la valeur de location.hash qui est ancienne (valeur du premier chargement de la page). Alors que la valeur récupérée manuellement est différente de location.hash, il faut toujours la récupérer via document.URL.

var hash = document.URL.substr(document.URL.indexOf('#')+1)

7 votes

Mise à jour : document.URL ne contient pas de valeur de hachage sur firefox 3.6 donc location.href est sûr var hash = location.href.substr(location.href.indexOf('#')+1)

6voto

LIUFA Points 3642

Pour ceux qui recherchent une solution purement javascript

 document.getElementById(location.hash.substring(1)).style.display = 'block'

J'espère que cela vous fera gagner du temps.

5voto

j08691 Points 86464

Depuis jQuery 1.9, la fonction :target correspondra au hachage de l'URL. Vous pourriez donc le faire :

$(":target").show(); // or $("ul:target").show();

Ce qui sélectionnerait l'élément dont l'ID correspond au hachage et l'afficherait.

3voto

squarecandy Points 882

J'utilise ceci pour aborder les implications de sécurité notées dans la réponse de @CMS.

// example 1: www.example.com/index.html#foo

// load correct subpage from URL hash if it exists
$(window).on('load', function () {
    var hash = window.location.hash;
    if (hash) {
        hash = hash.replace('#',''); // strip the # at the beginning of the string
        hash = hash.replace(/([^a-z0-9]+)/gi, '-'); // strip all non-alphanumeric characters
        hash = '#' + hash; // hash now equals #foo with example 1

        // do stuff with hash
        $( 'ul' + hash + ':first' ).show();
        // etc...
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X