【问题标题】:jQuery 1.4.4: How to find an element based on its data-attribute value?jQuery 1.4.4:如何根据数据属性值查找元素?
【发布时间】:2011-05-11 01:11:03
【问题描述】:

我想这应该是一个非常简单的任务,但使用 Firefox for Mac,3.6.12 以下不起作用:

// assign data attributes
$('.gallery li').each(function(i) {
    $(this).data('slide',i+1);
});

// outputting an empty jQuery object
console.log($('.gallery li[data-slide]'));

// this does not work either outputting an empty jQuery object
console.log($("[data-slide]"));

使用 Firebug 我可以看到所有数据幻灯片属性(包括它们的数值)都正确附加到 lis 并注销:

$('.gallery li').each(function(index) {
  console.log($(this).data());
});

按预期输出:

Object { slide=1}
Object { slide=2}
Object { slide=3}
Object { slide=4}

那么为什么第一个console.log 不起作用?

【问题讨论】:

    标签: jquery jquery-selectors sizzle custom-data-attribute


    【解决方案1】:

    data 将项目添加到 jQuery 的内部数据持有者,而不是 data- 属性。这些被读入 jQuery 的data() 结构,但使用jQuery 插入的值不会反馈到DOM。

    模仿这一点的最简单方法是使用.filter()

    // To replicate $('.gallery li[data-slide]')
    $('.gallery li').filter(function(){
        return (undefined !== $(this).data('slide'));
    });
    

    您也可以将其作为自定义选择器:

    $.expr[':'].hasData = function(obj, index, meta, stack) {
        return (undefined !== $(obj).data(meta[3]));
    };
    
    $('.gallery li:hasData(slide)'); // li elements under .gallery with "slide" data set
    $(':hasData(slide)'); // any element with "slide" data set
    

    【讨论】:

    • 啊好吧,我误解了 .data() 函数作为 html5 中数据属性的快捷方式。所以要读/写那些我需要做$(el).attr('data-slide',1)
    • @Jannis - 如果您对data() 并不真正感兴趣并且只想要属性,请使用.attr()
    • @Jannis 如果你真的想。不过,为什么不使用.data()?更加灵活和强大——例如您可以设置字符串以外的值。另请注意,data() 不会使用 attr() 更新。
    • 感谢您的澄清!超级有用,一旦我切换到使用.attr('data-* …,一切正常。我仍然不太明白.data 方法是如何“更好”地看到的,因为它使得根据当前数据值查找元素变得更加困难? 还是我在这里遗漏了什么……?
    • @Jannis 查找元素并不是数据属性的真正用途。它们非常简单地用于存储数据。在这种情况下,您可能应该采用语义方法并添加一个slide 类或类似的东西。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2016-11-08
    • 2023-03-29
    相关资源
    最近更新 更多