スペースを含むjquery ID


127

IDにスペースがある場合、jQueryを使用してIDでDOM内のアイテムを選択する方法を誰かが知っていますか?

たとえば、私のアイテムのIDは

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

jQueryでこれをどのように選択しますか?

私がやれば

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

jQueryは、コンテンツのIDとモジュールのIDの両方を持つアイテムを見つけようとしますが、これは私が探しているものではありません。

これらの2つのワードIDが広範囲に使用されている古いコードベースで作業しているため、すべてのIDを確認して変更することは悪いことです。


@Glavićあなたの発言はすべて真実です。ただし、新しく受け入れられた回答は、このソリューションを本当に必要としている人々にとってより役立つでしょう。本当に行き詰まっている人にとって、スペースの扱い方を知ることは彼らが本当に必要としていることです。
ジェフデイビス

はい、それは本当ですが、私の回答にはスペースのあるIDの解決策もあり、太字になっています;)
GlavićNov

1
IDの代わりにIDを正しく書き込むための賛成投票。申し訳ありません。そして、はい、私はほとんどの人が頭字語や短縮語を複数形するためにアポストロフィを使用して知っているが、それはまだ私には食料品店のアポストロフィのように見えますwalkinthewords.blogspot.com/2009/05/grocers-apostrophe.html
フアン・メンデス

回答:


253

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

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

または、タグも指定します:

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

$( '#id')とは異なり、ページ内に同じIDを持つ複数の要素がある場合、これは複数の要素を返すことに注意してください。


1
Glavicからの回答でさえ、最良の提案です。私はこの答えが問題を解決したと思います:)
GusDeCooL

8
これは私をたくさん助けてくれました。私はajaxを介してひどいHTMLを読んでおり、HTMLの構造やIDのフォーマットを制御できません。彼らのIDにはスペースが含まれているため、Elliotの回答は非常に役立ちますが、glavicの回答はまったく役に立ちません。
デイブレーカー、2011年

ありがとう、素晴らしい答えです!
alcfeoh 2015年

62

スペースは使用しないでください。その理由は単純です。スペース文字はID属性には無効です。

IDトークンは文字([A-Za-z])で始まり、その後に任意の数の文字、数字([0-9])、ハイフン( "-")、アンダースコア( "_")、コロンを続けることができます( ":")、およびピリオド( "。")。

しかし、標準を気にしない場合は、 $("[id='content Module']")

同様のスレッド> HTMLのid属性の有効な値は何ですか?

編集:HTML 4.01とHTML5でのIDの違い

HTML5は、id属性に対する追加の制限を取り除きます。ドキュメントで一意であることを除いて、残っている唯一の要件は、値に少なくとも1つの文字が含まれている必要があり(空にすることはできません)、スペース文字を含めることができないことです。

リンク:http : //mathiasbynens.be/notes/html5-id-class


4
+1。命名基準に従うことで、それらに従わない場合の回避策を考える必要がなくなります。
マットb

これにより、有効なIDが得られるように、表示されている2番目の単語を切り捨てるというアイデアが生まれました。問題の世話をしました、ありがとう!
ジェフ・デイビス

1
ここではHTML 4.01仕様を引用しています。それはまだID属性値で使用するスペース文字に許可されていませんが、HTML5は、これらの制限のほとんどを取り除くん:mathiasbynens.be/notes/html5-id-class
マティアスBynens

2
「標準」のためだけに、古いプロジェクトのコードベース全体を調べてハックアップするように男に言わないでください。多くても、これはコメントを評価するものであり、確かに受け入れられる回答ではありません:(
Coderer

おかしい。スペースはほとんどの目的で問題なく機能しますが、なぜ非標準にするのですか?
Lodewijk 2014

23

誰かが気になった場合に備えて、スペースをエスケープするとうまくいくことがわかりました。これは、ターゲットDOMを制御できない場合(たとえば、ユーザースクリプト内から)に特に役立ちます。

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

必要な二重円記号に注意してください。


JavaScript自体が他の言語の文字列定数の場合、最大4つのバックスラッシュ。
ブリリアント

2
次に、その他の言語自体がさらに別の言語の文字列定数である場合、最大8つのバックスラッシュ:)
daniel1426

1
文字列が再帰的にエスケープされると、スタックオーバーフローが発生します
Jeff Davis

7

Chrisが提案したメソッドは、jQuery関数で動作するように適応できる可能性があります。

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

1
ああ!さらに下にスクロールする必要があります!
gotomanners 2013年

2

試すアイデア:

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

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

セミコロンは、JavaScriptエラーを引き起こす可能性があります。また、スペースを含まないようにIDを変更することをお勧めします。

また、お試しください document.getElementByID("content Module")


1
document.getElementByIDは通常のオブジェクトを提供し、探しているjQuery関数を実行できませんでした。ただし、同様の状況では、これは良い回避策になります。
ジェフデイビス

1
$(document.getElementByID("content Module"))jqueryオブジェクトを与えませんか?
gotomanners 2013年

1

これでうまくいきました。

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

0

それはですが、HTMLでID属性値のスペースを持っていることは技術的に無効、あなたは実際にjQueryを使用してそれを選択することができます。

http://mothereffingcssescapes.com/#content%20moduleを参照してください

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

jQueryはSelectors APIのような構文を使用$('#content\\ module');するため、を使用して要素を選択できますid="content module"

CSSで要素をターゲットにするには、次のようにエスケープできます。

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

0

これは、要素にIDの正確な値が必要な場合に機能します

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

しかし、要素が他のIDの有無にかかわらず(クラスのように)それらの1つだけを持っているかどうかを確認したい場合

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

id="content"or id="content Module"またはor がある場合、これは要素を選択しますid="content Module other_ids"


0

私の場合、エスケープはスペースを%20に置き換えるため、エスケープが機能しないことがわかりました。代わりにreplaceを使用して、ページのh1をリストアイテムのテキストに置き換えました。メニューに含まれるもの:

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

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

0

jQueryでコンマやスペースを含む要素IDに問題があったため、これを実行しました。

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

これにはスペースがあり、機能しません:

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

これにはカンマがあり、機能しません:

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


0

セレクターのその他の文字を(スペースとともに)エスケープします

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>

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