42 votes

Échapper aux crochets lors de l'attribution d'un nom de classe à un élément

Quelqu'un sait-il comment échapper au caractère crochet lors de la définition d'un nom de classe avec jQuery ?

Essayez ce qui suit :

$('#txtFirstname').addClass('test[someval]')

puis

$('#txtFirstname').attr('class')

vous verrez que la classe est là.

Essayez maintenant

$('#txtFirstname').hasClass('test[someval]')

FAIL

La seule raison à laquelle je peux penser est les crochets.

Et j'en ai besoin pour ma validation jQuery, vous voyez.

85voto

Duncan Points 4376

9 votes

Les deux barres obliques inversées sont uniquement dues à l'échappement des chaînes de caractères JavaScript. C'est en fait, correctement, une seule barre oblique inversée que vous envoyez à jQuery lui-même.

8 votes

Pour <span id="foo[bar]" /> que vous pouvez sélectionner avec $("#foo\\[bar\\]") comme indiqué, ou $('[id="foo[bar]"]') en utilisant le l'attribut équivaut au sélecteur

0 votes

@Travis Je ne pense pas que les crochets [] soient valides dans "id" pour les versions html antérieures à 5. Ils sont valides dans "name".

9voto

digiogo Points 81

L'introduction de Page de l'API jQuery donne l'explication ci-dessus à ce sujet :

Pour utiliser l'un des métacaractères ( tels que !"#$%&'()*+,./:;<=>?@[]^`{|}~ ) en tant que partie littérale d'un nom, il doit être être échappé par deux barres obliques inversées : \\.

0 votes

Cette citation est tirée du Sélecteurs catégorie. Un nom de catégorie n'est pas un sélecteur. Si vous ajoutez deux barres obliques inverses, vous ajouterez une barre oblique fictive au nom de la classe : preuve

4voto

Eric Kigathi Points 371

Si le sélecteur est contenu dans une variable (ou si vous pouvez le faire entrer dans une variable), le code ci-dessous peut être utile :

selector_name = $this.attr('class');
//e.g selector_name = users[0][first:name]

escaped_selector_name = selector_name.replace(/(:|\.|\[|\])/g,'\\$1');
//e.g escaped_selector_name = users\\[0\\]\\[first\\:name\\]

En bref, nous préfixons tous les caractères spéciaux par un double backslash. Voici de la documentation supplémentaire provenant du site de jQuery :

http://learn.jquery.com/using-jquery-core/faq/how-do-i-select-an-element-by-an-id-that-has-characters-used-in-css-notation/

1voto

Álvaro G. Vicario Points 57607

Réponse courte : vous n'avez pas besoin d'échapper aux parenthèses parce que l'argument est un nom de la classe et non un sélecteur . Il n'a pas fonctionné pour vous en raison d'un bogue dans les versions antérieures de jQuery qui a été corrigé depuis longtemps.

Pour le démontrer, voici votre code s'exécutant sous différentes versions :

Donc le problème a été apparemment corrigé sur jQuery/1.4.0. J'ai trouvé un billet à ce sujet (bien qu'il soit marqué comme étant corrigé en 1.4.2 plutôt qu'en 1.4.0).

J'insiste : la règle de citer ou d'échapper les métacaractères avec \\ afin de les utiliser comme partie littérale d'un nom ne s'applique qu'à sélectionneurs . Cependant, le .hasClass() ne reçoit pas un sélecteur comme argument mais comme nom de classe :

.hasClass( className )

    className
    Type: String
    The class name to search for.

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