Select elements by attribute
我有一组带有生成ID的复选框,其中一些具有额外的属性。是否可以使用jquery检查元素是否具有特定属性?例如,我可以验证以下元素是否具有属性"myattr"?属性的值可以变化。
1
| <input type="checkbox" id="A" myattr="val_attr">A</input> |
例如,在不逐个选中的情况下,如何获取具有此属性的所有复选框的集合?这有可能吗?
1 2 3 4 5
| if ($('#A').attr('myattr')) {
// attribute exists
} else {
// attribute does not exist
} |
编辑:
当myattr存在但为空字符串或"0"时,上述内容将属于else分支。如果这是一个问题,您应该在undefined上明确测试:
1 2 3 4 5
| if ($('#A').attr('myattr') !== undefined) {
// attribute exists
} else {
// attribute does not exist
} |
号
- 回答不太好。"未定义"不是javascript中的关键字。见constc.blogspot.com/2008/07/&hellip;
- 你说得对…但重新定义undefined被认为是一种边缘情况,上述比较将在所有情况中的99%起作用。
- 如果属性有空字符串,则不起作用。例如myattr=''
- 回答不好,如果myattr==0怎么办?例如,选择索引。(.prop()现在用于此,但我认为它仍然是一个有效的示例)。
- @mhenry-我会考虑将undefined重新定义为编码错误,而不是在某人重新定义后使用undefined。
- @Jimbojonny我将重新定义它,只是为了给您上一课,让您不要对全局名称空间进行假设。;-)
- @mhenry-那你就错了:)如果你是在为我或我旁边建立项目,我会要求你改正你的错误。如果它是一个开放源码包,那么我(连同许多用户)将停止使用它,因为它的编码很差。如果你不改变它,那么其他人最终会在没有错误的情况下输出一个版本,人们会使用这个版本,而你会丢失你自己的项目,就像以前很多次有人创建了一个好主意的包,但是实现不好。不管是哪种方式,它都能教会你一个关于编码实践的教训。
- 一种解决方案是在您当前的范围内显式地[不]定义undefined:(function() { var undefined; if(... !== undefined) { ... } })();。当然,将typeof与字符串"undefined"比较起来容易一些。不过,它很冗长,所以我更喜欢为自己编写一个函数包装器。MyNamespace.defined(arg)。请注意,typeof在IE中可能会出现错误行为。
- if(typeof$('a').attr('myattr')!=='未定义')
- 可以使用void 0代替undefined,以避免undefined不是关键字的问题。
你的意思是你能选择它们吗?如果是,那么是:
- 请注意,如果您正在测试是否存在(例如,可能在if语句中),那么执行以下操作可能更正确/可靠:if($(":checkbox[myattr]").length()>0)…
- @Rinogo:实际上,您所需要的只是if($(":checkbox[myattr]").length)。在不需要严格相等(值和类型)的相等性测试中,>0,0的计算结果也不是必需的()after长度。
- 如果您尝试以下方法,它将抛出JS错误:td[myattr]。所以我认为这个功能是专门针对复选框的。
- 冒号选择伪类,由类型attr决定。要对td应用相同的内容,只需省略冒号。
- 或者如果您想查看某个东西是否没有属性,比如查找所有没有href属性的链接。埃多克斯1〔10〕
我知道问这个问题已经很久了,但我发现支票更清楚了:
1 2 3 4 5
| if ($("#A").is('[myattr]')) {
// attribute exists
} else {
// attribute does not exist
} |
。
(在这里找到)
有关IS的文档可在此处找到
- @我支持你。
- 这是最合理的答案
- 根据W3C,布尔属性是通过属性的存在或不存在来定义的。jquery提供了方法.attr()来操作属性值。但是我们如何添加一个没有值的属性呢?jquery文档(1.8.2)中没有描述用于测试属性是否存在的方法。您知道如何使用jquery添加属性吗?
- @C喜欢添加属性,我会这样做:$("a").prop("mynewattribute",somevalue);您可以给somevalue您选择的任何值:字符串、数字、空字符串、真/假。
- 这将添加具有指定值的属性,该值与没有值的属性不同。
- 我同意,这是最好的答案(使用jquery)-非常清楚和简洁。我确实想知道为什么jquery不只是有hasattribute()函数,答案是,原生的javascript已经有了一个。任何HTML DOM元素都有一个方法hasattribute("attributeName")。所以您可以这样做:$('a')[0].hasAttribute('myattr')@chmike-我不认为您可以使用jquery函数添加空属性,但您可以使用HTML DOM元素对象以类似的方式执行此操作:$("a")[0].setattributenode(document.createAttribute("mynewa&zwnj;&8203;ttribute"));
- 只是一个我喜欢这个答案的注释,但是对于询问如何添加没有值的属性的注释感到困惑。这些与问题或答案无关。
这将起作用:
1
| $('#A')[0].hasAttribute('myattr'); |
。
- 参见链接:stackoverflow.com/questions/1318076/&hellip;
- @反向编码器,你的链接有什么意义?这项测试似乎相当好,尤其是因为在这里您经常使用$(this).,而此时您可以直接使用this.hasAttribute('...')(当然,不关心旧的浏览器)。
在javascript中,…
…返回true*。这是==和===的区别。另外,可以定义名称undefined(它不是像null这样的关键字),所以最好检查其他方式。最可靠的方法可能是比较typeof运算符的返回值。
。
不过,在这种情况下,与空值比较应该有效。
*假设undefined实际上是未定义的。
- 未定义不是javascript中的保留关键字。在jquery中,可以完全记住它的名称,因为它是用"var"构造的,没有值。在magic库代码的顶部,事实上,有一行语句"var undefined";这样,在jquery范围内就用这个名称定义了一个未定义的变量…但也可以通过键入"var unnamed",将其命名为"unnamed";
- 这不是检查属性,而是检查javascript对象中的属性,为什么会有6个upvotes?
$("input[attr]").length可能是更好的选择。
使用"typeof"、"jquery"、"is"和"filter"时,有几个想法被抛到了脑后,所以我想我会发布一个快速的性能比较。这种类型似乎是最好的选择。虽然其他方法也可以工作,但在为此工作调用JQ库时,似乎存在明显的性能差异。
在本文中,使用.is和属性选择器[]可以轻松地添加函数(或原型):
1 2 3
| function hasAttr($sel,attr) {
return $sel.is('['+attr+']');
} |
号
1 2 3 4
| if (!$("#element").attr('my_attr')){
//return false
//attribute doesn't exists
} |
- 这可能不起作用,因为您可以添加一个没有值的属性。在这种情况下,此条件将通过,尽管所需的行为可以返回true,但属性已设置。类似于phps isset(),或者例如在js $("#element").attr('my_attr') === false中,
简单地说:
1
| $('input[name*="value"]') |
更多信息:官方文件
- 在用双引号定义的字符串中的未转义双引号,不是有效的字符串。不幸的是,我不能为您编辑它,因为编辑必须更改6个字符或更多,但需要更改。
1
| $("input#A").attr("myattr") == null |
。
- 正如我们的示例所建议的那样,$().attr()不会返回空值,而是返回未定义的值。
- 我在Firebug工作,但那可能是Firebug的事。
- 还没试过,但文档上写着:docs.jquery.com/attributes/attr name
- 因为"空=未定义"
我已经创建了具有上述预期行为的NPM包。
链接到[NPM]和[Github]
使用非常简单。例如:
1 2 3
| <p id="test" class="test">something
</p>
$("#test").hasAttr("class") |
号
返回true。
也适用于Camelcase。
除了选择具有$('[someAttribute]')或$('input[someAttribute]')属性的所有元素外,还可以使用函数对对象执行布尔检查,例如在单击处理程序中:
埃多克斯1〔13〕
jquery将以字符串形式返回属性。因此,可以检查该字符串的长度,以确定是否设置了:
1 2 3 4
| if ($("input#A").attr("myattr").length == 0)
return null;
else
return $("input#A").attr("myattr"); |
。
- 这个主意不错,但不管用…=
- 所以,我知道这已经一年多了,我早该解决的。我很好奇什么部分不起作用?如果我知道你只是想选择它们,我就不会给出上面的代码。我以为你想单独检查一下。实际上,jquery会以字符串的形式返回属性,您可以像检查任何其他字符串一样检查该字符串的长度。因此,只要选择器和属性正确,就应该能够测试特定输入是否具有该属性。不管怎样,我只是不想让人们对这一原则打折,因为它确实有效。
- 如果属性不存在,它将失败,在这种情况下,$("input a")。attr("myattr")返回未定义,而不是字符串和未定义。length将失败。
- 仅检测空属性与包含内容的属性,在不存在的属性上失败。最初的问题是关于检测属性的存在性,使其成为问题的答案。