IDにドットが含まれている場合、jqueryを使用してIDでHTMLノードを選択する方法


178

私のhtmlがこのように見えた場合:

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

JQueryで#SearchBag.CompanyNameを選択するにはどうすればよいですか?私はそれを機能させることができず、それがすべてを壊しているのはドットだと心配しています。煩わしいのは、すべてのIDの名前を変更することは、読みやすさの低下は言うまでもなく、多くの作業になるということです。

注:
レイアウト用にテーブルが作成されない方法について話を始めないでください。私はCSSの価値と欠点を十分に認識しており、CSSをできる限り使用するように努めています。


1
IDのピリオドは有効なHTMLですか?
cletus

7
はい。IDには、「-」、「_」、「。」を含めることができます。および「:」。w3.org/TR/html4/types.html#type-name
bobince

Jeps、二重の<title>タグを除いて、私のページのすべての検証は、asp.netのMVCフレームワークは、生成...
ボリスCallens

回答:


215

コメントの@Tomalak:

IDセレクターの前にはハッシュ#を付ける必要があるため、ここにあいまいさはありません。

「#id.class」は、一致するIDと個別のクラスの両方を必要とする有効なセレクターです。これは有効であり、常に完全に冗長であるとは限りません。

リテラル「。」を選択する正しい方法 CSSでは「#id \ .moreid」をエスケープします。これは一部の古いブラウザー(特にIE5.x)で問題を引き起こしていましたが、最新のすべてのデスクトップブラウザーでサポートされています。

同じメソッドはjQuery 1.3.2でも機能するようですが、徹底的にテストしていません。quickExprはそれを拾いませんが、より複雑なセレクターパーサーはそれを正しく理解しているようです:

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

1
「#id.classは、一致するidと個別のクラスの両方を必要とする有効なセレクターです」:HTML仕様に従って、IDはドキュメント全体で一意である必要があります。「#id.class」は何に適していますか?つまり、「#id」より具体的に指定することはできません。
Tomalak

2
@Tom:「#id.class」は、同じスタイルシートを使用する複数のドキュメント、またはクライアント側のスクリプトで状態を設定する場合に適しています。たとえば、「#navhome.navselected」です。
ボビンス

@bobince:ええ、クレタスは同じ例を思いついたので、私はそれが有効であることを疑います。それでも私には奇妙に感じられ、それができることの真の利点を私は見ることができません。特に、IDにドットを許可するHTMLと、「。navselected」を常に使用して同じことを実行できるという事実に照らして。
トマラック

たとえば、選択した#navhomeを選択した#navaboutとは異なる色で点灯させ、他の.navselectedプロパティを共有することができます。このような状況が常に発生するとは言いませんが、たまに必要になることは確かです。
ボビンス

3
私は@Tomalakの答えは次のように、よりエレガントだと思う:$('[id="profile.birthdate"]')
dr.dimitru

118

1つのバリエーションは次のようになります。

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

1
確かに。ソリューションが機能し、$( "#SearchBag.CompanyName")が機能しない理由を教えてください。
Boris Callens

9
.CompanyNameはクラスセレクターとして扱われるためです。
cletus

2
ソースコードを手早く見てみると、それは故意の設計決定かバグのどちらかです。idセレクターの識別に使用される正規表現(quickExprという名前)には、ドットが有効な文字として含まれていません。ただし、HTML仕様では許可されています。
トマラック

5
IDにクラスセレクターがあると便利です。すべてのページに#menu要素があり、いずれかのページでそれを異なるものにしたいとします。たとえば#menu.hideme?限界は知っていますが、それは有効です。
cletus

2
これは明らかに優れた答えです。次のような変数でも機能します。$( "tr [id = '" + private_var + "']")。css( "background-color"、 "#EEEEEE");
スティーブK

33

使用すれば、何もエスケープする必要はありません document.getElementById

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

getElementById 入力は単なるid属性であると想定しているため、ドットはクラスセレクターとして解釈されません。


きちんとしたソリューションは、ドットを含む可能性のある動的IDでもうまく機能します
Cookalino

17

短い答え:id =の要素"foo.bar"がある場合は、セレクターを使用できます$("#foo\\.bar")

より長い答え:これはjqueryドキュメントの一部です-セクションセレクターはここで見つけることができます:http : //api.jquery.com/category/selectors/

ドキュメントの冒頭で質問に回答します。

メタ文字(たとえば、 
! "#$%& '()* +、。/:;?@ [\] ^` {|}〜) 
名前のリテラル部分として、文字をエスケープする必要があります 
2つのバックスラッシュ:\\。たとえば、id = "foo.bar"の要素がある場合、
セレクター$( "#foo \\。bar")を使用できます。W3C CSS仕様には、
有効なCSSセレクターに関するルールの完全なセット。また便利です
識別子のCSS文字エスケープシーケンスに関するMathias Bynensによるブログエントリ。

4
この質問は3年以上前のものであり、そのためドキュメントは同じではなかったと思いますか?
Reimius 2012

9

IDが変数内にある場合、attrの選択が適切であると思われます。

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

4

これはjQueryセレクターAPIに文書化されています

!"#$%&'()*+,./:;<=>?@[\]^`{|}~名前のリテラル部分としてメタ文字(など)を使用するには、 2つのバックスラッシュでエスケープする必要があります\\。たとえば、を含む要素は id="foo.bar"、セレクターを使用できます$("#foo\\.bar")

つまり、接頭辞にを.付け\\ます。

$('#SearchBag\\.CompanyName')

問題は.、クラスと一致するため、$('#SearchBag.CompanyName')と一致すること<div id="SearchBag" class="CompanyName">です。エスケープ\\.された.は、特別な意味を持たない通常として扱われ、希望するIDと一致します。

これは!"#$%&'()*+,./:;<=>?@[\]^`{|}~、jQueryのセレクターとして特別な意味を持つすべての文字に適用されます。


2

より一般的な解決策を探している人、特殊文字の前にバックスラッシュを1つ挿入する解決策を見つけました。これにより、特殊文字を含むdivから名前とIDを取得することに関連する問題が解決します。

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

「Str1 \\。str2 \\%str3」を返します

これが役立つことを願っています!


1

属性セレクターを使用できます。

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

または、要素タイプを指定できます。

$("input[id='SearchBag.CompanyName']");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.