1

http://jsfiddle.net/CuURK/

我有许多单选按钮,例如:

<input type='radio' name='myradio' id='myradio' />

我需要选择标记中没有 value 属性的所有单选按钮,然后为它们设置属性。以下测试不起作用:

$('#myradio').val() // returns 'on'
$('#myradio').attr('value') // returns 'on'

这似乎适用于 Chrome,但不适用于 IE8:

$('#myradio').is('[value]'); //doesn't work in IE8

确定元素是否具有 value 属性的最安全方法是什么?对上述行为有解释吗?

4

3 回答 3

2

最好和最快的方法是坚持使用 CSS 选择器:

$('input[type="radio"]:not([value])')

将返回所有存在该属性的input元素-请参阅this fiddleradio value

因为它返回一个集合,你可以做任何你想做的事情,比如添加缺失的属性、添加一个类、隐藏或删除元素,而不需要.each()循环,因为 jQuery 的大多数方法都可以在集合上工作——参见这个小提琴

因此,在您的情况下添加缺少的属性:

$('input[type="radio"]:not([value])').attr('value', 'foobar');

请记住,选择器是有效的 CSS3 选择器。


更新:

根据这一点[attr],我们的选择器将永远不会在 IE8 中匹配,因为如果给定的 attr 为空(我们正在尝试匹配),则IE8 无法匹配使用。

所以我们必须遍历inputs 并检查属性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"valueon

最后,如果搜索到的属性不存在,jQuery 会.attr()返回(参见源代码):所以通常你可以检查undefined

typeof $('#foo').attr('attributeName') === 'undefined'

查看元素是否具有该attributeName属性。

于 2012-07-11T07:38:05.727 回答
1

以下将起作用:

$('input[type="radio"]:not([value])')

如图所示:http: //jsfiddle.net/4sLzc/1/

返回“on”的原因.val()是没有 value 属性的单选按钮返回“on”是默认行为。这不是 jQuery 的事情:如果你说 纯 JavaScript 也会发生同样的事情document.getElementById("myradio").value,或者当你提交表单时,你会发现服务器端的“on”是实际提交的值。

于 2012-07-11T07:40:35.353 回答
0

这将匹配具有 value 属性的元素

$('input[value]');

这对于那些不

$('!input[value]');
于 2012-07-11T07:11:51.257 回答