更改后,按数据属性选择元素

Jus*_*nas 2 html jquery jquery-selectors custom-data-attribute

我有许多具有预定义属性的元素data-key="foo".现在,在更新此元素值后,我还更新了它的data-keyattribute($(this).data('key', 'boo');).之后我无法再使用选择器选择它[data-key="boo"].我在这做错了什么?
我不想再次循环所有元素并检查它的data-key属性值.另外据我所知,:data(key)选择器无法按键和值选择元素?

$(document).ready(function() {
  $('[data-key="foo"]').data('key', 'boo');

  setTimeout(function() {
    $('[data-key="boo"]').css('color', 'green');
    $('#element').append(' - Now it must be green, because data-key now is ' + $('#element').data('key'));
  }, 1000);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-key="foo" id="element">MAKE THIS GREEN</div>
<div data-key="boo" >data-key="boo" by default...</div>
Run Code Online (Sandbox Code Playgroud)

Sat*_*pal 6

使用时.data(),它使用$.cache not with attribute存储在内部缓存中.因此,使用属性值选择器时,只选择一个元素.

你可以通过这些帖子

  1. jQuery .data()如何工作?
  2. jQuery.data()存储在哪里?

如果要使用属性来选择元素,则使用.attr()而不是.data()

$(document).ready(function() {
  $('[data-key="foo"]').attr('data-key', 'boo');

  setTimeout(function() {
    $('[data-key="boo"]').css('color', 'green');
    $('#element').append(' - Now it must be green, because data-key now is ' + $('#element').data('key'));
  }, 1000);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-key="foo" id="element">MAKE THIS GREEN</div>
<div data-key="boo" >data-key="boo" by default...</div>
Run Code Online (Sandbox Code Playgroud)


但是,如果您仍想使用,.data()则可以使用它.filter()来识别元素.

$('[data-key="foo"]').data('key', 'boo');
setTimeout(function() {
  $('[data-key]').filter(function(){
    return $(this).data('key') == 'boo';
   }).css('color', 'green');
}, 1000);
Run Code Online (Sandbox Code Playgroud)

$(document).ready(function() {
  $('[data-key="foo"]').data('key', 'boo');

  setTimeout(function() {
    $('[data-key]').filter(function(){
      return $(this).data('key') == 'boo';
     }).css('color', 'green');
    $('#element').append(' - Now it must be green, because data-key now is ' + $('#element').data('key'));
  }, 1000);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-key="foo" id="element">MAKE THIS GREEN</div>
<div data-key="boo" >data-key="boo" by default...</div>
Run Code Online (Sandbox Code Playgroud)