按属性选择元素


253

我有一个带有生成的ID的复选框集合,其中一些具有额外的属性。是否可以使用JQuery检查元素是否具有特定属性?例如,我可以验证以下元素是否具有属性“ myattr”吗?该属性的值可以变化。

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

例如,如何一目了然地获取具有此属性的所有复选框的集合?这可能吗?


2
顺便说一句,<input />是一个空标签,并不意味着要在其中包含内容。也许您不关心当前是否有myatttr时进行验证...
ScottE


如果您已经有了一个集合,并且只想过滤出具有特定属性的元素$filtered = $collection.filter('[attribute_name]');
那就

Answers:


190

您是说可以选择它们吗?如果是这样,那么是:

$(":checkbox[myattr]")

4
请注意,如果要测试是否存在(例如,可能在if语句中),则可能更正确/更可靠:if($(“:checkbox [myattr]”)。length()> 0)...
rinogo 2011年

14
@rinogo:实际上,您需要的只是if($(“:checkbox [myattr]”)。length)。长度后的()不是必需的,> 0也不是,在不需要严格相等(值和类型)的相等性测试中,0都不为假。
bmarti44 2011年

1
如果尝试使用:td [myattr]之类的方法,则会引发js错误。因此,我认为此功能专门针对复选框。
fooledbyprimes

6
冒号选择由attr类型确定的伪类。要将相同的内容应用于td,只需省略冒号即可。
dhochee

或者,如果您想查看某些内容是否没有属性,例如查找所有没有href属性的链接。$("#myBox").find('a').filter(':not([href])')
timbrown 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 2012年

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添加属性吗?
chmike

@chmike要添加属性,我可以这样:$(“#A”)。prop(“ myNewAttribute”,someValue); 您可以给someValue选择任何值:字符串,数字,空字符串,true / false。
Jonathan Bergeron

这将添加具有指定值的属性,该值与没有值的属性不同。
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年


8

在JavaScript中,...

null == undefined

...返回true*。==和之间的区别===。另外,undefined可以定义名称(它不是像nullis这样的关键字),因此最好检查一下其他方式。最可靠的方法可能是typeof比较运算符的返回值。

typeof o == "undefined"

不过,在这种情况下,将null与之比较应该可以。

*假设undefined实际上是未定义的。


未定义不是JavaScript中的保留关键字。在jQuery中,可以精确地更改其名称,因为它是使用“ var”构造函数构造的并且未赋值。实际上,在魔术库代码的顶部,有一行显示“ var undefined;”。并以此方式在jQuery范围内用该名称定义了一个未定义的变量。但是可以通过键入“ var unnamed;”将其全部命名为“ unnamed”。
Emanuele Del Grande

1
这不检查属性,而是检查javascript对象中的属性,为什么有6个投票?
ncubica

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,但设置了该属性。类似于PHP isset()或例如js $("#element").attr('my_attr') === false
ulkas 2014年

2

本文所述,使用.is和属性选择器[],您可以轻松添加函数(或原型):

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


1

只是:

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

更多信息:官方文档


1
用双引号定义的字符串中的转义双引号,不是有效的字符串。不幸的是,我不能为您编辑它,因为编辑必须更改6个字符或更多,但是需要更改。
Jimbo Jonny 2012年

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元素是否具有特定属性,我正在使用一个小插件,true该插件返回jQuery集合中的第一个元素是否具有此属性:

/** 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");

因此,我知道已经过去一年了,应该早就解决了。我很好奇哪个部分不起作用?如果我知道您只是尝试选择它们,那么我不会给出上面的代码。我以为您想单独检查它们。实际上,JQuery确实将属性作为字符串返回,您可以像检查其他任何字符串一样检查该字符串的长度。因此,只要您的选择器和属性正确,您就应该能够测试以查看特定输入是否具有该属性。无论如何,我只是不想让人们不屑一顾,因为它确实有效。
zach 2012年

6
在属性不存在的情况下它将失败,在这种情况下$(“ input#A”)。attr(“ myattr”)返回undefined而不是字符串,并且undefined.length将失败
Rune FS

仅检测到一个空属性与一个具有内容的属性,对一个不存在的属性失败。最初的问题是关于检测该属性的存在,因此将其作为问题的答案是失败的。
Jimbo Jonny 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.