JQueryセレクターからDOM要素を取得する方法


179

jqueryセレクターから実際のDOMElementを取得するのを見つけるのが非常に困難です。サンプルコード:

<input type="checkbox" id="bob" />
  var checkbox = $("#bob").click(function() { //some code  } )

別のコードでは、チェックボックスのチェックされた値を特定しようとしています。

  if ( checkbox.eq(0).SomeMethodToGetARealDomElement().checked )
    //do something.

そして、私はしたくない:

  if ( checkbox.eq(0).is(":checked"))
    //do something

これでチェックボックスの周りが回りますが、本当のDOMElementが必要な場合もあります。


4
これが必要になる可能性がある1つのケース:Knockout.jsでは、関数applyBindingsはjQueryセレクターではなくDOMノードを想定しています。この質問(とその答え)はまさに必要なものです。
Muhammad Alkarouri 2013

回答:


264

生のDOM要素にアクセスするには、次のようにします。

$("table").get(0);

またはもっと簡単に:

$("table")[0];

ただし、実際にはこれが必要なものはあまりありません(私の経験では)。チェックボックスの例を見てみましょう:

$(":checkbox").click(function() {
  if ($(this).is(":checked")) {
    // do stuff
  }
});

より「jquery'ish」であり、(imho)より簡潔です。それらに番号を付けたい場合はどうなりますか?

$(":checkbox").each(function(i, elem) {
  $(elem).data("index", i);
});
$(":checkbox").click(function() {
  if ($(this).is(":checked") && $(this).data("index") == 0) {
    // do stuff
  }
});

これらの機能の一部は、ブラウザの違いを隠すのにも役立ちます。一部の属性は異なる場合があります。典型的な例はAJAX呼び出しです。未加工のJavascriptでこれを適切に行うには、の約7つの代替ケースがありXmlHttpRequestます。


1
ありがとうございます。ただし、getメソッドは、dom要素ではなくjquery要素を返します。それ以外の場合は、.checkedプロパティ呼び出しが機能します。
BillRob 2009年

$('a').get(0).nodeType==1このページのFirebugで試してみてください。評価はtrueですか、失敗ですか。
meder omuraliev 2009年

@BillRob get()がDOM要素を返さない場合、何かがおかしい。こちらのドキュメントをご覧ください:docs.jquery.com/Core/get#index
Sixten Otto

$('<input type=checkbox>').appendTo('body').get(0).checked
meder omuraliev 2009年

5
DOMプロパティを明示的に使用する場合、jQueryを使用する意味は何ですか?TypeErrorの可能性に対してエラーを防止する一貫性のあるコードを用意した方がよいのではないでしょうか?数年前、私はエリート主義のECMAScripterであり、フレームワークを避けていましたが、矛盾について学ぶほど、結局は依存するようになりました。ブラウザエンジンはますます高速になっていますが、速度が顕著でない限り、これについて心配する必要はありません。フレームワークを使用する全体のポイントは、実行可能な一貫したコードで多くの問題を解決することです。
meder omuraliev 2009年

7

編集:あなたが要素を取得できなかったと仮定すると、私は間違っていたようです。他の人がここに投稿したので、あなたはそれを得ることができます:

$('#element').get(0);

これが実際に一致したDOM要素を返すことを確認しました。


2
繰り返しますが、すべてのブラウザで同じではありません。IE7以前では失敗します。
スラボ

6

要素を文字列として取得する必要がありました。

jQuery("#bob").get(0).outerHTML;

これはあなたに次のようなものを与えます:

<input type="text" id="bob" value="hello world" />

... DOM要素ではなく文字列として。


1

DOM要素と直接やり取りする必要がある場合は、単に使用しないでdocument.getElementByIdください。特定の要素とやり取りしようとしている場合は、おそらくクラス名が1つの要素のみにあると想定するか、他のオプションがあると仮定すると、IDがわかります。危険を冒す。

しかし、私は他の人に同意する傾向があります。jQueryは非常に柔軟であるため、ほとんどの場合、jQueryが提供するものを使用して、必要なことを実行することを学ぶ必要があります。

更新:コメントに基づくこれは良い説明のある投稿です:http : //www.mail-archive.com/jquery-en@googlegroups.com/msg04461.html

$(this).attr("checked") ? $(this).val() : 0

チェックされている場合は値を返し、チェックされていない場合は0を返します。

$(this).val() チェックされているかどうかにかかわらず、domに到達して要素の属性「値」を取得するだけです。


2
document.getElementByIdまたはMS ajax $ getメソッドを使用できます。MSがjqueryを承認したので、私はms ajax javascriptへの依存を破り、jqueryを学ぼうとしています。jqueryがチェックボックスの.val()メソッドの動作を変更することは完全に直観に反するようです。他のすべての.val()呼び出しと同様に、フォームの投稿フィールドを返します。jQueryは非常にうまく機能しているので、val()メソッドを変更するのは混乱し、迅速な回避策を見つけることを望んでいました。
BillRob 2009年

2
だからこのページをチェックしてください:mail-archive.com/jquery-en@googlegroups.com/msg04461.html
James Black

2
Jamesがval()メソッドが実際に.attr( "value")であるというのは奇妙です。なぜ2つの異なる方法があるのか​​しら。私にとって.val()はフォーム投稿フィールドの値です。
BillRob 2009年

2
@BillRob-jQueryは、実際の要素に移動して自分で行う必要がなく、値を取得する方法を単純化および標準化しているだけです。
ジェームズブラック

IDと親子シナリオを備えた複雑なセレクターが必要で、1行のコードでjQueryを介してそれを取得できる場合がありますが、document.getElementByIdの使用には1日かかります。ライブラリのミキシングは悪い考えだと私は同意しますが、それは時々起こるだけであり、jqueryオブジェクトからDOM要素を取得するタスクは、特に.get(0)がブラウザー互換性を持たない場合、非常に困難です。
スラボ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.