Come selezionare i nodi HTML per ID con jquery quando l'id contiene un punto?


178

Se il mio HTML fosse così:

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

Come posso selezionare # SearchBag.CompanyName con JQuery? Non riesco a farlo funzionare e temo che sia il punto a spezzare tutto. La cosa fastidiosa è che rinominare tutti i miei ID sarebbe un sacco di lavoro, per non parlare della perdita di leggibilità.

Nota: per
favore non iniziamo a parlare di come le tabelle non sono fatte per il layout. Sono molto consapevole del valore e delle carenze dei CSS e faccio del mio meglio per usarlo il più possibile.


1
Un periodo in un ID è persino valido HTML?
cletus,

7
Sì. Gli ID possono contenere '-', '_', '.' e ':'. w3.org/TR/html4/types.html#type-name
bobince

Jeps, tutte le mie pagine convalidano tranne il doppio tag <title> generato dal framework mvc asp.net ..
Boris Callens

Risposte:


215

@Tomalak nei commenti:

poiché i selettori ID devono essere preceduti da un hash #, qui non ci dovrebbero essere ambiguità

"# Id.class" è un selettore valido che richiede sia un id che una classe separata per la corrispondenza; è valido e non sempre totalmente ridondante.

Il modo corretto di selezionare un "." Letterale nel CSS è scappare: "#id \ .moreid". Questo causava problemi in alcuni browser meno recenti (in particolare IE5.x), ma tutti i browser desktop moderni lo supportano.

Lo stesso metodo sembra funzionare in jQuery 1.3.2, anche se non l'ho testato a fondo; quickExpr non lo prende, ma il parser selettore più coinvolto sembra farlo bene:

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

1
"# id.class è un selettore valido che richiede sia un id che una classe separata per la corrispondenza": come da specifica HTML, gli ID devono essere univoci in tutto il documento. A cosa servirebbe "# id.class"? Voglio dire, non puoi essere più specifico di "#id", vero?
Tomalak

2
@ Tom: “# id.class” potrebbe essere utile per più documenti utilizzando lo stesso foglio di stile o impostando gli stati con scripting lato client. Ad esempio "# navhome.navselected".
bob,

@bobince: Sì, Cletus ha escogitato lo stesso esempio e credo che sia valido. Tuttavia mi sembra strano e non vedo il vero vantaggio di poterlo fare. Soprattutto alla luce dell'HTML che consente i punti nell'ID e il fatto che è sempre possibile utilizzare ".navselected" per ottenere lo stesso.
Tomalak

Ad esempio, potresti volere che una #navhome selezionata si illumini in un colore diverso da una #navabout selezionata, ma che altre proprietà .navselected siano condivise. Non direi che questa situazione si presenta continuamente, ma di certo ne ho avuto bisogno di tanto in tanto.
bob,

3
Penso che la risposta di @Tomalak sia più elegante, come:$('[id="profile.birthdate"]')
dr.dimitru,

118

Una variante sarebbe questa:

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

1
Infatti. Potresti dirmi perché la tua soluzione funziona e $ ("# SearchBag.CompanyName") no?
Boris Callens,

9
Perché .CompanyName è trattato come un selettore di classe.
cletus,

2
Esaminando rapidamente il codice sorgente, si tratta di una decisione di progettazione intenzionale o di un bug. La regex utilizzata per identificare i selettori di identificazione (denominati quickExpr) non include il punto come carattere valido. Le specifiche HTML tuttavia lo consentono.
Tomalak

5
Avere un selettore di classe su un ID è forse utile. Immagina di avere un elemento #menu in ogni pagina ma che vuoi renderlo diverso in una delle tue pagine. # menu.hideme per esempio? Marginale Lo so ma è valido.
cletus

2
Questa è chiaramente la risposta superiore. Funziona anche con variabili come questa: $ ("tr [id = '" + private_var + "']"). Css ("background-color", "#EEEEEE");
Steve K,

33

Non è necessario sfuggire a nulla se si utilizza document.getElementById:

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

getElementById presuppone che l'input sia solo un attributo id, quindi il punto non verrà interpretato come un selettore di classe.


Ottima soluzione, funziona bene anche con ID dinamico che può contenere punti
Cookalino

17

Risposta breve : se si dispone di un elemento con id = "foo.bar", è possibile utilizzare il selettore$("#foo\\.bar")

Risposta più lunga : fa parte della documentazione di jquery - selettori di sezione che puoi trovare qui: http://api.jquery.com/category/selectors/

Alla tua domanda viene data risposta all'inizio della documentazione:

Se desideri utilizzare uno dei meta-caratteri (come 
! "# $% & '() * +,. /:;? @ [\] ^` {|} ~) 
come parte letterale di un nome, devi sfuggire al personaggio con 
due barre rovesciate: \\. Ad esempio, se hai un elemento con id = "foo.bar",
puoi usare il selettore $ ("# foo \\. bar"). La specifica CSS W3C contiene
l'insieme completo delle regole relative ai selettori CSS validi. Utile anche il
post di blog di Mathias Bynens sulle sequenze di escape dei caratteri CSS per identificatori.

4
Ti rendi conto che questa domanda ha più di tre anni e che la documentazione potrebbe non essere stata la stessa allora, giusto?
Reimius,

9

attr selection sembra essere appropriato quando il tuo ID è in una variabile:

var id_you_want='foo.bar';
$('[id="' + id_you_want + '"]');

4

Questo è documentato nell'API dei selettori jQuery :

Per utilizzare uno dei meta-caratteri (come ad esempio !"#$%&'()*+,./:;<=>?@[\]^`{|}~) come una parte letterale di un nome, deve essere sfuggito con con due barre rovesciate: \\. Ad esempio, un elemento con id="foo.bar", può utilizzare il selettore $("#foo\\.bar").

In breve, prefisso il .con \\.

$('#SearchBag\\.CompanyName')

Il problema è che .corrisponderà a una classe, quindi $('#SearchBag.CompanyName')corrisponderebbe <div id="SearchBag" class="CompanyName">. I fuggiti \\.verranno trattati come normali .senza alcun significato speciale, corrispondenti all'ID desiderato.

Questo vale per tutti i personaggi !"#$%&'()*+,./:;<=>?@[\]^`{|}~che altrimenti avrebbero un significato speciale come selettore in jQuery.


2

Ragazzi che sono alla ricerca di una soluzione più generica, ho trovato una soluzione che inserisce una barra rovesciata prima di qualsiasi carattere speciale, questo risolve i problemi relativi al recupero di nome e ID da un div che contiene caratteri speciali.

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

restituisce "Str1 \\. str2 \\% str3"

Spero che questo sia utile!


1

È possibile utilizzare un selettore di attributi:

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

Oppure puoi specificare il tipo di elemento:

$("input[id='SearchBag.CompanyName']");
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.