Wie wähle ich HTML-Knoten nach ID mit jquery aus, wenn die ID einen Punkt enthält?

178

Wenn mein HTML so aussah:

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

Wie kann ich mit JQuery # SearchBag.CompanyName auswählen? Ich kann es nicht zum Laufen bringen und ich fürchte, es ist der Punkt, der alles kaputt macht. Das ärgerliche ist, dass das Umbenennen aller meiner IDs eine Menge Arbeit bedeuten würde, ganz zu schweigen von dem Verlust der Lesbarkeit.

Hinweis:
Bitte lassen Sie uns nicht darüber sprechen, wie Tabellen nicht für das Layout erstellt werden. Ich bin mir des Werts und der Mängel von CSS sehr bewusst und bemühe mich , es so weit wie möglich zu nutzen.

Boris Callens
quelle
1
Ist ein Punkt in einer ID überhaupt gültiges HTML?
Cletus
7
Ja. IDs können '-', '_', '.' Enthalten. und ':'. w3.org/TR/html4/types.html#type-name
bobince
Jeps, meine Seiten werden alle validiert, mit Ausnahme des doppelten <title> -Tags, das das asp.net mvc-Framework generiert.
Boris Callens

Antworten:

215

@Tomalak in Kommentaren:

Da ID-Selektoren ein Hash # vorangestellt werden muss, sollte hier keine Mehrdeutigkeit bestehen

"# Id.class" ist ein gültiger Selektor, für dessen Übereinstimmung sowohl eine ID als auch eine separate Klasse erforderlich sind. es ist gültig und nicht immer völlig überflüssig.

Der richtige Weg, um ein Literal '.' in CSS ist es zu entkommen: "#id \ .moreid". Dies verursachte früher in einigen älteren Browsern (insbesondere IE5.x) Probleme, wird jedoch von allen modernen Desktop-Browsern unterstützt.

Die gleiche Methode scheint in jQuery 1.3.2 zu funktionieren, obwohl ich sie nicht gründlich getestet habe. quickExpr nimmt es nicht auf, aber der komplexere Selektor-Parser scheint es richtig zu machen:

$('#SearchBag\\.CompanyName');
Bobince
quelle
1
"# id.class ist ein gültiger Selektor, für den sowohl eine ID als auch eine separate Klasse erforderlich sind": Gemäß der HTML-Spezifikation müssen IDs im gesamten Dokument eindeutig sein. Wofür wäre "# id.class" gut? Ich meine, Sie können nicht spezifischer sein als "#id", oder?
Tomalak
2
@Tom: "# id.class" eignet sich möglicherweise für mehrere Dokumente, die dasselbe Stylesheet verwenden oder Status mit clientseitigem Scripting festlegen. Zum Beispiel "# navhome.navselected".
Bobince
@ Bobince: Ja, Cletus hat das gleiche Beispiel gefunden, und ich denke, es ist gültig. Trotzdem fühlt es sich für mich seltsam an und ich kann den echten Vorteil nicht erkennen, das zu können. Insbesondere im Hinblick auf HTML, das Punkte in der ID zulässt, und die Tatsache, dass Sie immer ".navselected" verwenden können, um dasselbe zu erreichen.
Tomalak
Möglicherweise möchten Sie beispielsweise, dass ein ausgewähltes #navhome in einer anderen Farbe als ein ausgewähltes #navabout leuchtet, andere .navselected-Eigenschaften jedoch gemeinsam genutzt werden. Ich würde nicht sagen, dass diese Situation die ganze Zeit auftaucht, aber ich habe sie auf jeden Fall gelegentlich gebraucht.
Bobince
3
Ich denke, die Antwort von @Tomalak ist eleganter, wie:$('[id="profile.birthdate"]')
dr.dimitru
118

Eine Variante wäre diese:

$("input[id='SearchBag.CompanyName']")
Tomalak
quelle
1
Tatsächlich. Können Sie mir sagen, warum Ihre Lösung funktioniert und $ ("# SearchBag.CompanyName") nicht?
Boris Callens
9
Weil .CompanyName als Klassenselektor behandelt wird.
Cletus
2
Wenn man sich den Quellcode kurz ansieht, handelt es sich entweder um eine absichtliche Entwurfsentscheidung oder um einen Fehler. Der zur Identifizierung von ID-Selektoren verwendete reguläre Ausdruck (mit dem Namen quickExpr) enthält den Punkt nicht als gültiges Zeichen. Die HTML-Spezifikation erlaubt es jedoch.
Tomalak
5
Möglicherweise ist es hilfreich, eine Klassenauswahl für eine ID zu haben. Stellen Sie sich vor, Sie haben auf jeder Seite ein # Menüelement, möchten es aber auf einer Ihrer Seiten anders gestalten. # menu.hideme zum Beispiel? Marginal Ich weiß, aber es ist gültig.
Cletus
2
Dies ist eindeutig die überlegene Antwort. Funktioniert auch mit Variablen wie diesen: $ ("tr [id = '" + private_var + "']"). CSS ("Hintergrundfarbe", "#EEEEEE");
Steve K
33

Sie müssen nichts entkommen, wenn Sie Folgendes verwenden document.getElementById:

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

getElementById Angenommen, die Eingabe ist nur ein ID-Attribut, sodass der Punkt nicht als Klassenselektor interpretiert wird.

Mixer
quelle
Ordentliche Lösung, funktioniert auch gut mit dynamischen ID, die Punkte enthalten kann
Cookalino
17

Kurze Antwort : Wenn Sie ein Element mit id = haben "foo.bar", können Sie den Selektor verwenden$("#foo\\.bar")

Längere Antwort : Dies ist Teil der jquery-Dokumentation - Abschnittsauswahl, die Sie hier finden: http://api.jquery.com/category/selectors/

Ihre Frage wird gleich zu Beginn der Dokumentation beantwortet:

Wenn Sie eines der Metazeichen verwenden möchten (z 
! "# $% & '() * + ,. /:;? @ [\] ^` {|} ~) 
Als wörtlicher Teil eines Namens müssen Sie dem Charakter mit entkommen 
zwei Backslashes: \\. Wenn Sie beispielsweise ein Element mit id = "foo.bar" haben,
Sie können den Selektor $ ("# foo \\. bar") verwenden. Die W3C-CSS-Spezifikation enthält
das vollständige Regelwerk für gültige CSS-Selektoren. Ebenfalls nützlich ist das
Blogeintrag von Mathias Bynens über CSS-Zeichen-Escape-Sequenzen für Bezeichner.
oneiros
quelle
4
Sie erkennen, dass diese Frage älter als drei Jahre ist und die Dokumentation dann möglicherweise nicht dieselbe war, oder?
Reimius
9

Die Auswahl von attr scheint angemessen zu sein, wenn sich Ihre ID in einer Variablen befindet:

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

Dies ist in der jQuery-Selektor-API dokumentiert :

Um eines der Metazeichen (z. B. !"#$%&'()*+,./:;<=>?@[\]^`{|}~) als wörtlichen Teil eines Namens zu verwenden, muss es mit zwei umgekehrten Schrägstrichen versehen werden : \\. Beispielsweise kann ein Element mit id="foo.bar"den Selektor verwenden $("#foo\\.bar").

Kurz gesagt, stellen Sie das .mit voran \\.

$('#SearchBag\\.CompanyName')

Das Problem ist, dass .eine Klasse übereinstimmt, also $('#SearchBag.CompanyName')übereinstimmen würde <div id="SearchBag" class="CompanyName">. Das Escape mit \\.wird als normal .ohne besondere Bedeutung behandelt und entspricht der gewünschten ID.

Dies gilt für alle Zeichen, !"#$%&'()*+,./:;<=>?@[\]^`{|}~die sonst als Selektor in jQuery eine besondere Bedeutung hätten.

Jon Surrell
quelle
2

Leute, die nach einer allgemeineren Lösung suchen, ich habe eine Lösung gefunden, die einen Schrägstrich vor Sonderzeichen einfügt. Dies behebt Probleme im Zusammenhang mit dem Abrufen von Name und ID aus einem Div, der Sonderzeichen enthält.

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

gibt "Str1 \\. str2 \\% str3" zurück

Hoffe das ist nützlich!

Abhishek
quelle
1

Sie können einen Attributselektor verwenden:

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

Oder Sie können den Elementtyp angeben:

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