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