184 votes

Comment sélectionner les nœuds html par ID avec jquery lorsque l'id contient un point ?

Si mon html ressemblait à ça :

<td class="controlCell">
    <input class="inputText" id="SearchBag.CompanyName" name="SearchBag.CompanyName" type="text" value="" />
</td>

Comment puis-je sélectionner #SearchBag.CompanyName avec JQuery ? Je n'arrive pas à le faire fonctionner et j'ai peur que ce soit le point qui casse tout. Ce qui est ennuyeux, c'est que renommer tous mes identifiants représenterait beaucoup de travail, sans parler de la perte de lisibilité.

Note :
Ne commençons pas à dire que les tables ne sont pas faites pour la mise en page. Je suis très conscient de la valeur et lacunes des CSS et essayez de l'utiliser autant que possible.

1 votes

Un point dans un ID est-il même un HTML valide ?

7 votes

Oui. Les ID peuvent contenir '-', '_', '.' et ':'. w3.org/TR/html4/types.html#type-name

0 votes

Jeps, mes pages sont toutes validées sauf pour la double balise <title> que le framework asp.net mvc génère

223voto

bobince Points 270740

@Tomalak dans les commentaires :

comme les sélecteurs d'ID doivent être précédés d'un dièse #, il ne devrait pas y avoir d'ambiguïté ici

"#id.class" est un sélecteur valide qui nécessite à la fois un id et une classe distincte pour correspondre ; c'est valide et pas toujours totalement redondant.

La manière correcte de sélectionner un '.' littéral dans une CSS est de l'échapper : "#id \.moreid ". Cela posait des problèmes dans certains anciens navigateurs (en particulier IE5.x), mais tous les navigateurs de bureau modernes le supportent.

La même méthode semble fonctionner dans jQuery 1.3.2, bien que je ne l'aie pas testée de manière approfondie ; quickExpr ne le détecte pas, mais l'analyseur de sélection plus complexe semble le faire correctement :

$('#SearchBag\\.CompanyName');

1 votes

"#id.class est un sélecteur valide qui nécessite à la fois un id et une classe distincte pour correspondre" : Conformément à la spécification HTML, les ID doivent être uniques dans tout le document. A quoi servirait "#id.class" ? Je veux dire, vous ne pouvez pas être plus spécifique que "#id", n'est-ce pas ?

2 votes

@Tom : "#id.class" pourrait être utile pour plusieurs documents utilisant la même feuille de style, ou pour définir des états avec des scripts côté client. Par exemple "#navhome.navselected".

0 votes

@bobince : Oui, cletus a donné le même exemple, et je suppose qu'il est valable. Pourtant, cela me semble étrange, et je ne vois pas le véritable avantage de pouvoir faire cela. Surtout si l'on considère que le HTML autorise les points dans l'ID et que l'on peut toujours utiliser ".navselected" pour obtenir la même chose.

126voto

Tomalak Points 150423

Une variante serait la suivante :

$("input[id='SearchBag.CompanyName']")

1 votes

En effet. Pourriez-vous me dire pourquoi votre solution fonctionne et que $("#SearchBag.CompanyName") ne fonctionne pas ?

10 votes

Parce que .CompanyName est traité comme un sélecteur de classe.

2 votes

En regardant rapidement le code source, il s'agit soit d'une décision de conception délibérée, soit d'un bogue. La regex utilisée pour identifier les sélecteurs d'id (nommée quickExpr) n'inclut pas le point comme caractère valide. La spécification HTML l'autorise pourtant.

33voto

Blender Points 114729

Après avoir vu tant de questions signalées comme étant des doublons de celle-ci, il pourrait être utile de disposer d'une solution robuste :

$(document.getElementById('strange.id[]'))

getElementById suppose que l'entrée est juste un attribut id, donc le point ne sera pas interprété comme un sélecteur de classe. De plus, c'est plus rapide que $('#strange\\.id\\[\\]') qui appellera getElementById en interne.

0 votes

Une solution soignée, qui fonctionne aussi très bien avec les ID dynamiques qui peuvent contenir des points.

18voto

oneiros Points 948

Cela fait partie de la documentation jquery - sélecteurs de section que vous pouvez trouver ici : http://api.jquery.com/category/selectors/

La réponse à votre question se trouve en fait au début de la documentation :

If you wish to use any of the meta-characters ( such as 
!"#$%&'()\*+,./:;?@\[\\\]^\`{|}~ ) 
as a literal part of a name, you must escape the character with 
two backslashes: \\\\. For example, if you have an element with id="foo.bar", 
you can use the selector $("#foo\\\\.bar"). The W3C CSS specification contains 
the complete set of rules regarding valid CSS selectors. Also useful is the 
blog entry by Mathias Bynens on CSS character escape sequences for identifiers.

4 votes

Vous réalisez que cette question date de plus de trois ans et que la documentation n'était peut-être pas la même à l'époque, n'est-ce pas ?

2voto

apandey846 Points 301

Pour ceux qui cherchent une solution plus générique, j'ai trouvé une solution qui insère une barre oblique inversée avant tout caractère spécial, ce qui résout les problèmes liés à la récupération du nom et de l'ID d'une division contenant des caractères spéciaux.

"Str1.str2%str3".replace(/[^ ^ \w\s ]/gi, ' \\ $&')

renvoie "Str1 \\.str2\\ %str3"

J'espère que cela vous sera utile !

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