使用jQuery通过数据属性选择元素

有没有一种简单直接的方法来根据元素的data属性选择元素?例如,选择所有具有名为customerID的数据属性且值为22的锚点。

我有点犹豫是否使用rel或其他属性来存储此类信息,但我发现根据存储在其中的数据选择元素要困难得多。

1218653 次浏览
$('*[data-customerID="22"]');

您应该可以省略*,但如果我没记错,这取决于您使用的jQuery版本,这可能会给出错误的结果。

请注意,为了与选择器API(document.querySelector{,all})兼容,属性值(22在这种情况下不能省略周围的引号。

此外,如果您在jQuery脚本中经常使用数据属性,您可能需要考虑使用HTML5自定义数据属性插件。这允许您使用.dataAttr('foo')编写更具可读性的代码,并在缩小后导致更小的文件大小(与使用.attr('data-foo')相比)。

使用$('[data-whatever="myvalue"]')将选择任何具有html属性的内容,但在较新的jQuery中,如果您使用$(...).data(...)附加数据,它似乎使用了一些神奇的浏览器东西并且不会影响html,因此.find不会发现先前的答案中所示。

验证(用1.7.2+测试)(另见小提琴):(更新后更完整)

var $container = $('<div><div id="item1"/><div id="item2"/></div>');
// add html attributevar $item1 = $('#item1').attr('data-generated', true);
// add as datavar $item2 = $('#item2').data('generated', true);
// create item, add data attribute via jqueryvar $item3 = $('<div />', {id: 'item3', data: { generated: 'true' }, text: 'Item 3' });$container.append($item3);
// create item, "manually" add data attributevar $item4 = $('<div id="item4" data-generated="true">Item 4</div>');$container.append($item4);
// only returns $item1 and $item4var $result = $container.find('[data-generated="true"]');

要选择数据属性data-customerID==22的所有锚点,您应该包含a以将搜索范围限制为该元素类型。在页面上有许多元素时以大循环或高频进行数据属性搜索会导致性能问题。

$('a[data-customerID="22"]');

像这样的构造:$('[data-XXX=111]')Safari8.0中不起作用。

如果您以这种方式设置数据属性:$('div').data('XXX', 111),则只有在像这样直接在DOM中设置数据属性时才有效:$('div').attr('data-XXX', 111)

我认为这是因为jQuery团队优化了垃圾收集器,以防止内存泄漏和对每个更改数据属性的DOM重建的大量操作。

要使其在Chrome值没有必须有另一对引号。

它只工作,例如,像这样:

$('a[data-customerID=22]');

对于谷歌搜索并希望使用数据属性进行选择的人来说:

$("[data-test]")将选择仅已经数据属性的任何元素(无论属性的值如何)。包括:

<div data-test=value>attributes with values</div><div data-test>attributes without values</div>

$('[data-test~="foo"]')将选择data属性包含foo但不必精确的任何元素,例如:

<div data-test="foo">Exact Matches</div><div data-test="this has the word foo">Where the Attribute merely contains "foo"</div>

$('[data-test="the_exact_value"]')将选择data属性精确值为the_exact_value的任何元素,例如:

<div data-test="the_exact_value">Exact Matches</div>

但不是

<div data-test="the_exact_value foo">This won't match</div>

通过JQuery filter()方法:

http://jsfiddle.net/9n4e1agn/1/

超文本标记语言:

<button   data-id='1'>One</button><button   data-id='2'>Two</button>

JavaScript:

$(function() {$('button').filter(function(){return $(this).data("id")   == 2}).css({background:'red'});});

我还没有看到没有jQuery的JavaScript答案。希望它能帮助某人。

var elements = document.querySelectorAll('[data-customerID="22"]');
elements[0].innerHTML = 'it worked!';
<a data-customerID='22'>test</a>

Info:

原生JS示例

获取节点元素列表

var elem = document.querySelectorAll('[data-id="container"]')

html:<div data-id="container"></div>

获取第一个元素

var firstElem = document.querySelector('[id="container"]')

html:<div id="container"></div>

定位返回节点列表的节点集合

document.getElementById('footer').querySelectorAll('[data-id]')

html:

<div class="footer"><div data-id="12"></div><div data-id="22"></div></div>

基于多个(OR)数据值获取元素

document.querySelectorAll('[data-section="12"],[data-selection="20"]')

html:

<div data-selection="20"></div><div data-section="12"></div>

基于组合(AND)数据值获取元素

document.querySelectorAll('[data-prop1="12"][data-prop2="20"]')

html:

<div data-prop1="12" data-prop2="20"></div>

获取值以

document.querySelectorAll('[href^="https://"]')

有时需要根据元素是否附加了数据项编程(也就是不通过dom属性)来过滤元素:

$el.filter(function(i, x) { return $(x).data('foo-bar'); }).doSomething();

上面的工作原理但不是很可读。更好的方法是使用伪选择器来测试这种事情:

$.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";};});

现在我们可以将原始语句重构为更流畅和可读的内容:

$el.filter(":hasData('foo-bar')").doSomething();

只是为了用“生活水平”的一些特征来完成所有的答案-到目前为止(在html5时代),没有第三方库就可以做到这一点:

  • 带有querySelector的纯/纯JS(使用CSS选择器):
    • 在DOM中选择第一个:document.querySelector('[data-answer="42"],[type="submit"]')
    • 在DOM中选择全部:document.querySelectorAll('[data-answer="42"],[type="submit"]')
  • 纯/纯CSS
    • 一些特定的标签:[data-answer="42"],[type="submit"]
    • 具有特定属性的所有标签:[data-answer]input[type]

它会工作:)

$('. ic-star[data-rate="1"]')。添加Class('额定');