最好和最快的方法是坚持使用 CSS 选择器:
$('input[type="radio"]:not([value])')
将返回所有radio的'input元素没有属性value存在-See this fiddle。
由于它返回一个集合,你可以做任何你想做的事情,比如添加缺失的属性、添加一个类、隐藏或删除元素,而不需要 .each() 循环,因为大多数 jQuery 的方法都可以在集合上工作— See this fiddle.
所以在你的情况下添加缺少的属性:
$('input[type="radio"]:not([value])').attr('value', 'foobar');
记住选择器是一个有效的 CSS3 选择器。
更新:
根据this,我们的选择器永远不会在 IE8 中匹配,因为如果给定的 attr 为空(我们正在尝试匹配),IE8 无法使用[attr] 匹配。
所以我们必须遍历inputs 并检查属性value 是否等于'',因为如果缺少它,jQuery 会返回一个空字符串。
Here's a fiddle,这在 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" />
这不是有效的解决方案,但它有效。
顺便说一句,正如我在 cmets 中所说,input 和 type="radio" 是 required to have the value attribute。如果不是,则文档无效,浏览器可能会尝试更正文档树 - Firefox 似乎添加了默认值 on,而 Safari 则没有。
最后,如果搜索到的属性不存在(see the source),jQuery 的.attr() 返回undefined:所以一般你可以检查
typeof $('#foo').attr('attributeName') === 'undefined'
查看元素是否具有attributeName 属性。