最良かつ最速の方法は、CSSセレクターに固執することです。
$('input[type="radio"]:not([value])')
属性が存在しないinput
すべての要素を返します—このフィドルを参照してください。radio
value
コレクションを返すので、不足している属性の追加、クラスの追加、要素の非表示または削除など、.each()
ループを必要とせずに好きなことを行うことができます。これは、jQueryのほとんどのメソッドがコレクションで機能するためです—このフィドルを参照してください。
したがって、不足している属性を追加する場合は、次のようにします。
$('input[type="radio"]:not([value])').attr('value', 'foobar');
セレクターは有効なCSS3セレクターであることに注意してください。
アップデート:
これによると[attr]
、指定された属性が空の場合、IE8はを使用して一致できないため、セレクターはIE8で一致しません(そしてそれを一致させようとしています)。
したがって、sをループしてinput
、属性value
がに等しいかどうかを確認する必要があります。これは''
、jQueryが欠落している場合は、空の文字列を返すためです。
これがフィドルです。IE8で動作します(実際のIE8で試すことができました)。
$('input[type="radio"]').each(function (index, element) {
var $this = $(this);
if ($this.get(0).outerHTML.indexOf('value') === -1) {
$this.addClass('found');
}
});
要素ごとに、そのouterHTML
プロパティにvalue
文字列が含まれているかどうかを確認します。文字列が含まれていない場合は、それが見つかりました。ご覧のとおり、次のようなノードでのみ失敗します。
<input type="radio" value />
IEはそれを次のように解析するためです。
<input type="radio" />
これは効率的なソリューションではありませんが、機能します。
ちなみに、コメントで言ったように、属性input
はwithtype="radio"
が必要value
です。そうでない場合、ドキュメントは無効であり、ブラウザはドキュメントツリーを修正しようとする可能性があります。Firefoxはデフォルト値のを追加するように見えますがon
、Safariは追加しません。
最後に、検索された属性が存在しない場合、jQuery.attr()
は戻ります(ソースを参照)。したがって、通常、次のことを確認できます。undefined
typeof $('#foo').attr('attributeName') === 'undefined'
要素にattributeName
属性があるかどうかを確認します。