ID jquery con spazi


127

Qualcuno sa come selezionare un elemento nel DOM per ID con jQuery, quando quell'ID ha uno spazio?

Ad esempio, l'ID del mio articolo sarebbe

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

Come lo selezionerei con jQuery?

Se solo lo facessi

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

jQuery proverà a trovare un elemento con sia l'ID del contenuto sia l'ID del modulo, che non è quello che sto cercando.

Dovrei aggiungere che sto lavorando con una vecchia base di codice in cui questi ID di due parole sono ampiamente utilizzati, quindi passare e cambiare tutti gli ID sarebbe male.


@ Glavić Tutte le tue affermazioni sono vere. Tuttavia, la risposta appena accettata sarà più utile per le persone che hanno davvero bisogno di questa soluzione. Per coloro che sono veramente bloccati, saper gestire gli spazi è ciò di cui hanno davvero bisogno.
Jeff Davis,

Sì, è vero, ma la mia risposta ha anche una soluzione per gli ID con spazi, è persino in grassetto;)
Glavić

1
Voto per la corretta scrittura degli ID invece degli ID. Mi dispiace, pet peeve. E sì, so che la maggior parte delle persone usa un apostrofo per pluralizzare acronimi e parole abbreviate, ma a me sembra ancora un apostrofo di un droghiere walkinthewords.blogspot.com/2009/05/grocers-apostrophe.html
Juan Mendes

Risposte:


253

Utilizzare un selettore di attributi.

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

O, meglio, specifica anche il tag:

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

Nota che, diversamente da $ ('# id'), questo restituirà più elementi se nella tua pagina sono presenti più elementi con lo stesso ID.


1
anche la risposta di Glavic è il miglior suggerimento. penso che questa risposta abbia risolto il problema :)
GusDeCooL

8
Questo mi ha aiutato molto. Sto leggendo un pessimo HTML tramite ajax e non ho alcun controllo sulla struttura dell'HTML o sul formato degli ID. I loro documenti di identità hanno degli spazi, quindi la risposta di Elliot aiuta enormemente, mentre quella di Glavic non offre alcun aiuto.
alba

Grazie, ottima risposta!
alcfeoh,

62

Non usare spazi, il motivo è semplice, il carattere spazio non è valido per l'attributo ID.

I token ID devono iniziare con una lettera ([A-Za-z]) e possono essere seguiti da un numero qualsiasi di lettere, cifre ([0-9]), trattini ("-"), caratteri di sottolineatura ("_"), due punti (":") e punti (".").

Ma se non ti interessano gli standard, prova $("[id='content Module']")

Discussione simile> Quali sono i valori validi per l'attributo id in HTML?

Modifica: come ID differisce tra HTML 4.01 e HTML5

HTML5 elimina le restrizioni aggiuntive sull'attributo id. Gli unici requisiti rimasti - oltre ad essere univoci nel documento - sono che il valore deve contenere almeno un carattere (non può essere vuoto) e che non può contenere alcuno spazio.

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


4
+1. Seguire gli standard di denominazione e quindi non è necessario trovare soluzioni alternative per quando non li si segue.
matt b

Ciò ha innescato l'idea di troncare la seconda parola in mostra in modo da avere ID validi. Si è preso cura del problema, grazie!
Jeff Davis,

1
Stai citando le specifiche HTML 4.01 qui. Sebbene non sia ancora consentito utilizzare caratteri spaziali nei valori degli attributi ID, HTML5 elimina la maggior parte di queste restrizioni: mathiasbynens.be/notes/html5-id-class
Mathias Bynens

2
Non dire all'uomo di passare attraverso e hackerare l'intera base di codice di un vecchio progetto solo perché "standard". Al massimo, questo dovrebbe valutare un commento, certamente non la risposta accettata :(
Coder

Divertente. Gli spazi funzionano bene per la maggior parte degli scopi, perché renderli fuori standard?
Lodewijk,

23

Nel caso qualcuno fosse curioso, ho scoperto che fuggire dallo spazio funzionerà. Ciò è particolarmente utile quando non si ha il controllo sul DOM di destinazione (ad esempio all'interno di uno script utente):

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

Notare la doppia barra rovesciata, che è necessaria.


Quindi fino a 4 barre rovesciate se JavaScript è di per sé una costante di stringa in un'altra lingua.
Brilliand,

2
Quindi fino a 8 barre rovesciate se quell'altra lingua è essa stessa una costante stringa in un'altra lingua :)
daniel1426

1
Questo ha un overflow dello stack quando la stringa viene sfuggita in modo ricorsivo
Jeff Davis,

7

Il metodo suggerito da Chris può probabilmente essere adattato per funzionare con le funzioni jQuery.

var element = document.getElementById('content Module');
$(element) ... ;

1
Ahhh! Avrei dovuto scorrere ulteriormente!
gotomanners

2

Un'idea da provare:

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

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

Il punto e virgola può causare un errore javascript. Consiglio anche di cambiare l'ID per non avere spazi.

Inoltre, prova document.getElementByID("content Module")


1
document.getElementByID mi darebbe l'oggetto normale e quindi non potrei fare le funzioni jQuery che sto cercando. Tuttavia, in circostanze simili sarebbe una buona soluzione.
Jeff Davis,

1
Non ti $(document.getElementByID("content Module"))darebbe un oggetto jquery?
gotomanners

1

Questo ha funzionato per me.

document.getElementById(escape('content Module'));

0

Mentre tecnicamente non è valido avere uno spazio in un valore di attributo ID in HTML , puoi effettivamente selezionarlo usando jQuery.

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

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

jQuery utilizza una sintassi simile all'API Selector, quindi è possibile utilizzare $('#content\\ module');per selezionare l'elemento con id="content module".

Per indirizzare l'elemento in CSS, è possibile evitarlo in questo modo:

<style>
  #content\ module {
    background: hotpink;
  }
</style>

0

questo può funzionare se si desidera che l'elemento abbia il valore esatto per l'id

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

ma se vuoi controllare se l'elemento ne ha solo uno (proprio come la classe) con o senza altri ID

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

questo selezionerà l'elemento se ha id="content"o id="content Module"oid="content Module other_ids"


0

Ho scoperto per il mio caso che escape non ha funzionato perché sostituisce gli spazi con% 20. Ho usato invece sostituire ad es. Per sostituire l'h1 della pagina con il testo di un elemento dell'elenco. Se il menu contiene:

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

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

0

Avevo problemi con gli ID degli elementi contenenti virgole e / o spazi in jQuery, quindi l'ho fatto e ha funzionato come un incantesimo:

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

Questo ha spazi e non funziona:

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

Questo ha una virgola e non funziona:

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


0

Sfuggire a qualsiasi carattere misc sul selettore (insieme agli spazi) .

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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.