是否有一种简单直接的方法可以根据data属性选择元素? 例如,选择具有名为customerID的数据属性且值22的所有锚点。
我有点犹豫是否使用rel或其他属性来存储此类信息,但我发现根据存储在其中的数据来选择元素要困难得多。
-
另请参见stackoverflow.com/q/4191386/292060
1
| $('*[data-customerID="22"]'); |
您应该可以省略*,但如果我没记错,根据您使用的jQuery版本,这可能会产生错误的结果。
请注意,为了与Selectors API(document.querySelector{,all})兼容,在这种情况下,属性值(22)周围的引号可能不会被省略。
此外,如果您在jQuery脚本中大量使用数据属性,则可能需要考虑使用HTML5自定义数据属性插件。这允许您使用.dataAttr('foo')编写更易读的代码,并在缩小后产生更小的文件大小(与使用.attr('data-foo')相比)。
-
请注意.data('foo')用于获取自jQuery 1.4.3以来'data-foo'属性的值。此外,由于jQuery 1.6:.data('fooBar')获取属性'data-foo-bar'。
-
@Zootius:是的,插件自述文件有一个注释:"从jQuery 1.4.3开始,.data()默认映射到自定义data-*属性,使这个插件变得多余。它仍然可以用于旧版本的jQuery。"
-
那么如何发布jQuery 1.4.3,通过其数据对象的值选择一个对象?让我想在这个例子中选择customerID等于22的任何对象?
-
此外,如果您只对存在特定数据属性感兴趣,则可以执行以下操作:$('[data-customerID]')
-
@Trip我很困惑。这篇文章回答了你对任何版本的jQuery的问题。
-
哇,两个人在针对同一问题的基本选择器问题上获得超过180个赞成率(截至2014-05-04):stackoverflow.com/questions/4146502/
-
@Sekai什么需要更新?答案与2010年的情况一样正确和相关。
-
抱歉,我认为data()会选择元素..
-
小心数据选择器。它们区分大小写。我总是用小写来保证安全。
-
据我所知,大写属性在jQuery中不起作用
-
如何获取元素匹配多个数据部分。即data-id == id,data-name == number?
-
如果数据字段是由jquery设置的(使用.data()),这不起作用,对吧?
对于人们谷歌搜索并想要更多关于选择数据属性的一般规则:
$("[data-test]")将选择仅具有data属性的任何元素(无论属性的值)。包含:
1 2
| attributes with values
attributes without values |
$('[data-test~="foo"]')将选择数据属性包含foo的任何元素,但不一定要精确,例如:
1 2
| Exact Matches
Where the Attribute merely contains"foo" |
$('[data-test="the_exact_value"]')将选择数据属性精确值为the_exact_value的任何元素,例如:
但不是
-
好。请注意,~=匹配以空格分隔的单词,而*=匹配任何子字符串。
-
^字符怎么样?
-
@ kuba44确实你也可以使用^,因此$('[data-test^=foo]')在这种情况下你选择以foo开头的任何东西,比如或但不是
-
完整的属性选择器列表:drafts.c??sswg.org/selectors-3/#attribute-selectors
使用$('[data-whatever="myvalue"]')将选择具有html属性的任何内容,但在较新的jQuery中,似乎如果使用$(...).data(...)附加数据,它会使用一些神奇的浏览器并且不会影响html,因此.find不会发现它在上一个答案中指出。
验证(使用1.7.2+测试)(另见小提琴):(更新为更完整)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var $container = $('');
// add html attribute
var $item1 = $('#item1').attr('data-generated', true);
// add as data
var $item2 = $('#item2').data('generated', true);
// create item, add data attribute via jquery
var $item3 = $('', {id: 'item3', data: { generated: 'true' }, text: 'Item 3' });
$container.append($item3);
// create item,"manually" add data attribute
var $item4 = $('Item 4');
$container.append($item4);
// only returns $item1 and $item4
var $result = $container.find('[data-generated="true"]'); |
-
啊哈 - 原来其他人在stackoverflow.com/questions/4191386/上指出了这一点
-
并提供.filter的解决方案
-
它使用了一些神奇的浏览器并且不会影响html:没有魔法这样的东西;)learningjquery.com/2011/09/using-jquerys-data-apis
-
@TomSarduy:"任何足够先进的技术都与魔术无法区分。"
-
从我的回答中可能并不明显,但值得注意的是,如果用.data(...)更改值,则不会更改html data-属性,因此如果执行以下操作 - [1] </i> 2)$('[data-icon="star"]).data('icon', 'circle')] - 再次执行过滤器$('[data-icon="star"]')将找到原始元素。
-
如果要添加稍后需要查找的数据属性,请使用$item.attr('data-id', 10);
-
@PedroMoreira - 除非我误读你的回复,否则你错过了我的答案 - 如果你通过.data设置它,你将无法找到它。你可以通过attr设置它,但它不是真正的"数据",只能用于DOM遍历。比较$('#comment-21628443').data('zaus-reply', 'yes')和$('#comment-21628443').attr('data-zaus-reply', 'no')的效果 - $('#comment-21628443').data('zaus-reply')将产生'是'但是找不到$('[data-zaus-reply="yes"')。
-
它对我有用! $('#comment-21628443').attr('data-x', 5)然后$('[data-x="5"]')找到它,然后$('#comment-21628443').data()打印Object {x: 5}
-
@PedroMoreira是的,但是你的例子是我在我的答案中指出的场景的倒退 - 尝试$('#comment-21628443').data('x', 5)而不是$('[data-x="5"]')而你什么也得不到。我会添加一些细节,试图让它更清晰。
-
嗯... @PedroMoreira很奇怪,我可以发誓你的原始评论不涉及设置属性。我说"它只能用于DOM遍历"是不正确的 - 你是对的,你可以稍后访问数据。但要注意:如果你以后通过data更改它,你将在属性中留下"陈旧"值,即使$el.data()返回正确的值,这可能会令人困惑。
-
是的,我已经知道了。 data()不能用于设置数据属性,它们必须用attr()设置,以便它们粘在html中。稍后可以使用data()来检索它们。
-
@TomSarduy我仍然喜欢收到关于这个问题的提醒 - 你无法为我的评论提供更好的设置;我真的很希望我能用这句话来...
要选择具有数据属性data-customerID==22的所有锚点,应包括a以将搜索范围限制为仅该元素类型。当页面上有许多元素时,以大循环或高频率执行数据属性搜索可能会导致性能问题。
1
| $('a[data-customerID="22"]'); |
没有jQuery,我还没有看到JavaScript的答案。希望它可以帮助某人。
1 2 3
| var elements = document.querySelectorAll('[data-customerID="22"]');
elements[0].innerHTML = 'it worked!'; |
信息:
-
数据属性
-
.querySelectorAll();
本机JS示例
获取元素的NodeList
1
| var elem = document.querySelectorAll('[data-id="container"]') |
html:
获取第一个元素
1
| var firstElem = document.querySelectorAll('[id="container"]')[0] |
html:
定位返回节点列表的节点集合
1
| document.getElementById('footer').querySelectorAll('[data-id]') |
HTML:
根据多个(OR)数据值获取元素
1
| document.querySelectorAll('[data-section="12"],[data-selection="20"]') |
HTML:
根据组合(AND)数据值获取元素
1
| document.querySelectorAll('[data-prop1="12"][data-prop2="20"]') |
HTML:
获取值以值开头的项目
1
| document.querySelectorAll('[href^="https://"]') |
通过Jquery filter()方法:
http://jsfiddle.net/9n4e1agn/1/
HTML:
1 2
| <button data-id='1'>One</button>
<button data-id='2'>Two</button> |
JavaScript的:
1 2 3 4
| $(function() {
$('button').filter(function(){
return $(this).data("id") == 2}).css({background:'red'});
}); |
-
你试过小提琴吗? FIlter方法只是另一种实现相同目的的方法。当您已经拥有一组Jquery对象并且需要根据数据属性或其他任何内容进行过滤时,它会很有用。
-
道歉,@ Blizzard。我评论了错误的答案。现在贴到右边。 #AlwaysALongDayAtWork
像这样的结构:$('[data-XXX=111]')在Safari 8.0中不起作用。
如果以这种方式设置数据属性:$('div').data('XXX', 111),它仅在您直接在DOM中设置数据属性时才有效:$('div').attr('data-XXX', 111)。
我认为这是因为jQuery团队优化了垃圾收集器,以防止在每个更改数据属性上重建DOM时出现内存泄漏和繁重操作。
-
这对我有很大帮助 - 如果我使用数据或prop方法,那么选择$('... [data-x ="y"]')是行不通的 - 我使用了attr(它将属性更改推送到DOM)。谢谢
要在Chrome中使用此值,该值不得包含另一对引号。
它只适用于,例如,像这样:
1
| $('a[data-customerID=22]'); |
-
这似乎是不正确的。至少现在不正确。我刚刚使用了$('[data-action ="setStatus"]')。removeClass('disabled');在Chrome中,它完美无缺。
-
我猜没有使用"在选择器内部,它可以用作$('[data-action=setStatus]').removeClass('disabled')
有时需要根据元素是否以编程方式附加到它们的数据项(也就是不通过dom-attributes)来过滤元素:
1
| $el.filter(function(i, x) { return $(x).data('foo-bar'); }).doSomething(); |
以上工作,但不是很可读。更好的方法是使用伪选择器来测试这种事情:
1 2 3 4 5 6
| $.expr[":"].hasData = $.expr.createPseudo(function (arg) {
return function (domEl) {
var $el = $(domEl);
return $el.is("[" + ((arg.startsWith("data-") ?"" :"data-") + arg) +"]") || typeof ($el.data(arg)) !=="undefined";
};
}); |
现在我们可以将原始语句重构为更流畅和可读的内容:
1
| $el.filter(":hasData('foo-bar')").doSomething(); |
-
第一个解决方案错过了return语句,它需要是:$ el.filter(function(i,x){return $(x).data('foo-bar');})。doSomething();
只是为了通过"生活标准"的某些功能完成所有答案 - 到现在(在html5时代),可以在没有第三方库的情况下完成:
-
带有querySelector的pure / plain JS(使用CSS-selectors):
-
选择DOM中的第一个:document.querySelector('[data-answer="42"],[type="submit"]')
-
在DOM中选择all:document.querySelectorAll('[data-answer="42"],[type="submit"]')
-
纯/纯CSS
-
一些特定的标签:[data-answer="42"],[type="submit"]
-
具有特定属性的所有标记:[data-answer]或input[type]