属性で要素を選択


253

生成されたIDを持つチェックボックスのコレクションがあり、それらのいくつかには追加の属性があります。JQueryを使用して、要素に特定の属性があるかどうかを確認することはできますか?たとえば、次の要素に属性「myattr」があるかどうかを確認できますか?属性の値はさまざまです。

<input type="checkbox" id="A" myattr="val_attr">A</input>

たとえば、この属性を持つすべてのチェックボックスのコレクションを1つずつチェックせずに取得するにはどうすればよいですか?これは可能ですか?


2
余談ですが、<input />は空のタグであり、内部にコンテンツを持つことを意図していません。おそらく、myatttrが存在するので、確認を確認することに関心がないかもしれません...
ScottE


すでにコレクションを持っていて、特定の属性を持つ要素だけをフィルタリングしたい場合は-ちょうどそれを行う-$filtered = $collection.filter('[attribute_name]');
jave.web

回答:


190

それらを選択できるということですか?そうであれば、はい:

$(":checkbox[myattr]")

4
存在をテストしている場合(おそらくifステートメントなどで)、おそらくより正確/信頼できることに注意してください:if($( ":checkbox [myattr]")。length()> 0)...
rinogo 2011

14
@rinogo:実際に必要なのはif($( ":checkbox [myattr]")。length)だけです。()の後の長さは必要ありません。> 0でもありません。0は、厳密な等価性(値と型の両方)を必要としない等価性テストでfalseと評価されます。
bmarti44

1
:td [myattr]のようなものを試行すると、jsエラーがスローされます。したがって、この機能は特にチェックボックスをターゲットにしていると思います。
fooledbyprimes 2012

6
コロンは、タイプattrによって決定される疑似クラスを選択します。同じことをtdに適用するには、コロンを省略します。
dhochee

または、属性を持たないすべてのリンクを検索するなど、属性が含まれていないかどうかを確認したい場合href$("#myBox").find('a').filter(':not([href])')
ティムブラウン、2014

368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

編集:

上記は存在するelse場合は-branchに該当しmyattrますが、空の文字列または "0"です。それが問題である場合、明示的にテストする必要がありますundefined

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}

3
良い答えではありません。「未定義」はJavaScriptのキーワードではありません。constc.blogspot.com/2008/07/…を
mhenry1384

16
そうです...しかし、再定義undefinedはエッジケースと見なされ、上記の比較はすべてのケースの99%で機能します。
Stefan Gehrig

6
属性に空の文字列がある場合は機能しません。例はmyattr = ''です
mythicalprogrammer

3
@mhenry-あなたはエラーになるでしょう:)あなたが私のために、または私と一緒にプロジェクトをビルドしていた場合、私はあなたにエラーを修正するように要求します。それがオープンソースパッケージである場合、私は(多くのユーザーと共に)コーディングが不十分であるという理由でその使用を中止します。あなたがそれを変更しなかった場合、誰かが最終的にエラーなしでバージョンをフォークし、代わりにそれを使用し、誰かが良いアイデアのパッケージを作成する前に何度も起こったように、あなたはあなた自身のプロジェクトを失うでしょう。貧弱な実装。どちらの方法でも、コーディングの実践についてのレッスンを教えてくれます:)
Jimbo Jonny

8
if(typeof $( '#A')。attr( 'myattr')!== 'undefined')
James Westgate

166

質問されてから久しぶりのことですが、次のように小切手がはっきりしていることがわかりました。

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(このサイトのここにあるように

ドキュメントはおよそされていますここに


W3Cによると、ブール属性は属性の有無によって定義されます。jQueryは、属性値を操作するためのメソッド.attr()を提供します。しかし、値のない属性をどのように追加しますか?属性の存在をテストするために提供するメソッドは、jQueryドキュメント(1.8.2)では説明されていません。jQueryで属性を追加する方法を知っていますか?
2013年

@chmike属性を追加するには、次のようにします。$( "#A")。prop( "myNewAttribute"、someValue); someValueには、文字列、数値、空の文字列、true / falseの任意の値を指定できます。
ジョナサンベルジェロン2013

これにより、値のない属性と同じではない値が割り当てられた属性が追加されます。
chmike 2013

5
私は同意します。これは(jQueryを使用して)最良の回答です-非常に明確で簡潔です。なぜjQueryにはhasAttribute()関数だけがないのか疑問に思っていました。その答えは、ネイティブのJavaScriptにはすでにあるのです。HTML Dom要素には、メソッドhasAttribute( 'attributeName')があります。$( '#A')[0] .hasAttribute( 'myattr')@chmike-jQuery関数を使用して空の属性を追加することはできないと思いますが、HTML Dom要素でそれを行うことができます次のような方法でオブジェクトを作成します。$( "#A")[0] .setAttributeNode(document.createAttribute( "myNewAttribute"));
ダニエルハワード

1
私はこの答えが好きなコメントですが、値なしで属性を追加する方法を尋ねるコメントについて混乱していました。これらは質問や回答とは関係ありません。
goodeye 2015

9

これは動作します:

$('#A')[0].hasAttribute('myattr');


@RetroCoder、あなたのリンクについてあなたのポイントは何ですか?このテストで頻繁に使用する、特にので、かなり良いようです$(this).<something>あなたが行うことができたときに、ここでthis.hasAttribute('...')直接(そしてもちろんの古いブラウザ、気にしないでください。)
アレクシスウィルケ

8

JavaScriptでは...

null == undefined

...戻りますtrue*。それは違います=====。また、名前undefinedを定義できるので(キーワードのようでnullはありません)、他の方法で確認することをお勧めします。最も信頼できる方法は、おそらくtypeof演算子の戻り値を比較することです。

typeof o == "undefined"

それでも、この場合はnullと比較して機能するはずです。

*仮定undefinedは実際には未定義です。


UndefinedはJavaScriptの予約キーワードではありません。jQueryでは "var"コンストラクターで構築され、評価されないため、その名前を厳密に変更できます。マジックライブラリコードの冒頭には、「var undefined;」という行があります。このようにして、jQueryスコープで未定義の変数がその名前で定義されます...しかし、「var unnamed;」と入力すると、同じように「unnamed」という名前を付けることができます。
エマヌエーレデルグランデ

1
これは属性をチェックするのではなく、JavaScriptオブジェクトのプロパティをチェックするので、なぜ6つの賛成票があるのですか?
ncubica 2013

5

$("input[attr]").length より良いオプションかもしれません。


4

"typeof"、jQuery ".is"、および ".filter"を使用していくつかのアイデアが投げ合わされたので、それらの簡単なパフォーマンス比較を投稿したいと思いました。typeofはこのための最良の選択のようです。他の方法は機能しますが、この作業のためにjqライブラリを呼び出すと、パフォーマンスに明らかな違いがあるようです。


2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}

1
値のない属性を追加できるため、これはおそらく機能しません。そのような場合、この条件は満たされますが、望ましい動作はtrueを返すことですが、属性が設定されます。PHPSに似isset()jsの中または、例えば$("#element").attr('my_attr') === false
ulkas

2

以下のように、このポスト、使用.isおよび属性セレクタ[]は、簡単に機能(またはプロトタイプ)を追加することができます。

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}


1

単に:

$('input[name*="value"]')

詳細:公式ドキュメント


1
二重引用符で定義された文字列内のエスケープされていない二重引用符。有効な文字列ではありません。残念ながら私はあなたのためにそれを編集することはできません。編集は6文字以上変更する必要があるためですが、変更する必要があります。
神保ジョニー

0

属性を持つすべての要素を選択することに加えて、$('[someAttribute]')または$('input[someAttribute]')クリックハンドラーなどのオブジェクトでブールチェックを実行する関数を使用することもできます。

if(! this.hasAttribute('myattr') ) { ...


0

上記の問題のある意図された動作でnpmパッケージを作成しました。

[npm][github]へのリンク

使い方はとても簡単です。例えば:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

trueを返します。

キャメルケースにも対応。


0

特定の属性を持つ要素を選択するには、上記の回答を参照してください。

特定のjQuery要素に特定の属性があるかどうかを確認するには、jQuery trueコレクションの最初の要素にこの属性があるかどうかを返す小さなプラグインを使用しています。

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}

-5

jQueryは属性を文字列として返します。したがって、その文字列の長さをチェックして、が設定されているかどうかを判断できます。

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");

それで、私はそれが1年以上経ったことを知っています、そして私はずっと前にそれに対処するべきでした。機能しなかった部分について知りたいのですが。私があなたがそれらを選択しようとしているだけだと知っていたら、私は上記のコードを与えなかっただろう。個別にチェックしたいと思いました。実際、JQueryは属性を文字列として返します。他の文字列と同じように、その文字列の長さを確認できます。したがって、セレクタと属性が正しい限り、特定の入力にその属性が含まれているかどうかをテストして確認できたはずです。とにかく、私は原理が機能するので人々にその原理を軽視してほしくない。
zach

6
属性が存在しない場合は失敗します。その場合、$( "input#A")。attr( "myattr")は文字列ではなくundefinedを返し、undefined.lengthは失敗します
Rune FS

空の属性とコンテンツのある属性のみを検出し、存在しない属性では失敗します。元の質問は、属性の存在を検出することであり、これを質問への回答として失敗にしました。
Jimbo Jonny
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.