ID jquery avec espaces

127

Est-ce que quelqu'un sait comment sélectionner un élément dans le DOM par ID avec jQuery, lorsque cet ID a un espace?

Par exemple, l'ID de mon article serait

<div id="content Module">Stuff</div>

Comment le sélectionnerais-je avec jQuery?

Si je fais juste

$("#content Module").whatever() 

jQuery essaiera de trouver un élément avec à la fois l'ID du contenu et l'ID du module, ce qui n'est pas ce que je recherche.

Je devrais ajouter que je travaille avec une ancienne base de code où ces deux identifiants de mot sont largement utilisés, donc passer en revue et changer tous les identifiants serait mauvais.

Jeff Davis
la source
@ Glavić Toutes vos déclarations sont vraies. Cependant, la réponse nouvellement acceptée sera plus utile aux personnes qui ont vraiment besoin de cette solution. Pour ceux qui sont vraiment coincés, savoir comment gérer les espaces est ce dont ils ont vraiment besoin.
Jeff Davis
Oui, c'est vrai, mais ma réponse a également une solution pour les
pièces
1
Votez pour écrire correctement les ID au lieu des ID. Désolé, bête noire. Et oui, je sais que la plupart des gens utilisent une apostrophe pour pluraliser des acronymes et des mots raccourcis, mais cela ressemble toujours à une apostrophe d'épicier pour moi walkinthewords.blogspot.com/2009/05/grocers-apostrophe.html
Juan Mendes

Réponses:

253

Utilisez un sélecteur d'attribut.

$("[id='content Module']").whatever();

Ou, mieux, spécifiez également la balise:

$("div[id='content Module']").whatever();

Notez que contrairement à $ ('# id'), cela renverra plusieurs éléments si vous avez plusieurs éléments avec le même identifiant dans votre page.

Elliot Nelson
la source
1
même la réponse de Glavic est la meilleure suggestion. Je pense que cette réponse a résolu le problème :)
GusDeCooL
8
Cela m'a beaucoup aidé. Je lis du HTML terrible via ajax et je n'ai aucun contrôle sur la structure du HTML ou le format des identifiants. Leurs identifiants contiennent des espaces, donc la réponse d'Elliot aide énormément, tandis que celle de glavic n'offre aucune aide.
daybreaker
Merci, bonne réponse!
alcfeoh
62

N'utilisez pas d'espaces, la raison en est simple, le caractère espace n'est pas un attribut valide pour ID.

Les jetons d'identification doivent commencer par une lettre ([A-Za-z]) et peuvent être suivis de n'importe quel nombre de lettres, chiffres ([0-9]), tirets ("-"), traits de soulignement ("_"), deux-points (":") et des points (".").

Mais si vous ne vous souciez pas des normes, essayez $("[id='content Module']")

Sujet similaire> Quelles sont les valeurs valides pour l'attribut id en HTML?

Edit: Comment l'ID diffère entre HTML 4.01 et HTML5

HTML5 supprime les restrictions supplémentaires sur l'attribut id. Les seules exigences restantes - en plus d'être unique dans le document - sont que la valeur doit contenir au moins un caractère (ne peut pas être vide) et qu'elle ne peut pas contenir de caractères d'espacement.

Lien: http://mathiasbynens.be/notes/html5-id-class

Glavić
la source
4
+1. En suivant les normes de dénomination, vous n'avez pas à trouver des solutions de contournement lorsque vous ne les suivez pas.
matt b
Cela a déclenché l'idée de tronquer le deuxième mot affiché pour que j'aie des identifiants valides. A pris soin de la question, merci!
Jeff Davis
1
Vous citez ici la spécification HTML 4.01. Bien qu'il soit toujours interdit d'utiliser des caractères d'espace dans les valeurs d'attribut ID, HTML5 supprime la plupart de ces restrictions: mathiasbynens.be/notes/html5-id-class
Mathias Bynens
2
Ne dites pas à l'homme de passer en revue et de pirater toute la base de code d'un ancien projet simplement parce que "standards". Tout au plus, cela devrait évaluer un commentaire, certainement pas la réponse acceptée :(
Coderer
Drôle. Les espaces fonctionnent très bien dans la plupart des cas, pourquoi les rendre non standard?
Lodewijk
23

Juste au cas où quelqu'un serait curieux, j'ai trouvé que s'échapper de l'espace fonctionnera. Ceci est particulièrement utile lorsque vous n'avez pas de contrôle sur le DOM cible (par exemple à partir d'un script utilisateur):

$("#this\\ has\\ spaces");

Notez la double barre oblique inverse, qui est obligatoire.

Morgon
la source
Ensuite, jusqu'à 4 barres obliques inverses si le JavaScript est lui-même une constante de chaîne dans un autre langage.
Brilliand
2
Puis jusqu'à 8 barres obliques inverses si cette autre langue est elle-même une constante de chaîne dans une autre langue :)
daniel1426
1
Cela a un débordement de pile lorsque la chaîne est échappée récursivement
Jeff Davis
7

La méthode suggérée par Chris peut probablement être adaptée pour fonctionner avec les fonctions jQuery.

var element = document.getElementById('content Module');
$(element) ... ;
ceejayoz
la source
1
Ahhh! J'aurais dû faire défiler plus bas!
gotomanners
2

Une idée à essayer:

$("#content" + &amp;#032; + "Module").whatever()

$("#content" + %20 + "Module").whatever()

Le point-virgule peut provoquer une erreur javascript. Je recommande également de changer l'ID pour ne pas avoir d'espace.

Essayez aussi document.getElementByID("content Module")

Chris Klepeis
la source
1
document.getElementByID me donnerait l'objet normal et ensuite je ne pourrais pas faire les fonctions jQuery que je recherche. Cependant, dans des circonstances similaires, ce serait une bonne solution.
Jeff Davis
1
Ne $(document.getElementByID("content Module"))vous donnerait pas un objet jquery?
gotomanners
1

Cela a fonctionné pour moi.

document.getElementById(escape('content Module'));
xxx
la source
0

Bien qu'il soit techniquement invalide d'avoir un espace dans une valeur d'attribut ID en HTML , vous pouvez en fait le sélectionner à l'aide de jQuery.

Voir http://mothereffingcssescapes.com/#content%20module :

<script>
  // document.getElementById or similar
  document.getElementById('content module');
  // document.querySelector or similar
  $('#content\\ module');
</script>

jQuery utilise une syntaxe semblable à l'API Selectors, vous pouvez donc l'utiliser $('#content\\ module');pour sélectionner l'élément avec id="content module".

Pour cibler l'élément en CSS, vous pouvez l'échapper comme ceci:

<style>
  #content\ module {
    background: hotpink;
  }
</style>
Mathias Bynens
la source
0

cela peut fonctionner si vous voulez que l'élément ait la valeur exacte de l'id

$("[id='content Module']").whatever();

mais si vous voulez vérifier si l'élément n'a qu'un seul d'entre eux (tout comme la classe) avec ou sans autres identifiants

$("[id~='content']").whatever();

cela sélectionnera l'élément s'il a id="content"ou id="content Module"ouid="content Module other_ids"

Robert
la source
0

J'ai trouvé pour mon cas que l'évasion ne fonctionnait pas car elle remplace les espaces par% 20. J'ai utilisé replace à la place, par exemple, pour remplacer le h1 de la page par le texte d'un élément de liste. Si le menu contient:

<li id="Contact Us"\>Contact Us</li>

function setTitle(menu) {
    $("h1").text( $("li#" + menu.replace(" ", "\\ ")).text() );
}
Martin
la source
0

J'avais des problèmes avec les identifiants d'élément contenant des virgules et / ou des espaces dans jQuery, alors j'ai fait cela et cela a fonctionné comme un charme:

var ele = $(document.getElementById('last, first'));

Cela a des espaces et ne fonctionne pas:

var ele = $('#last, first');

Cela a une virgule et ne fonctionne pas:

var ele = $('#last,first');

Steven Spungin
la source
0

Échapper à tout caractère divers sur le sélecteur (avec des espaces) .

var escapeSelector = function(string) {
  string = string||"";
  if (typeof string !== 'string') return false;
    return string.replace( /(:|\.|\[|\]|,|=|@|\s|\(|\))/g, "\\$1" );

}
console.log($("div[data-id="+escapeSelector("Document (0).json")+"]").text());   
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div data-id="Document (0).json">Howdy</div>

Donovan P
la source