【问题标题】:jQuery attribute name containsjQuery 属性名称包含
【发布时间】:2012-03-21 13:44:06
【问题描述】:

我正在尝试定位包含某个单词的属性名称,而不是您想的那种方式。

假设我有:

<div data-foo-bar="hello"></div>

如何定位属性名称中包含'data-foo' 的元素?

【问题讨论】:

标签: jquery jquery-selectors attributes


【解决方案1】:

我认为您不能像定位属性值一样定位属性名称。但是,您可以使用.filter() 来稍微有效地执行此操作:

$('div').filter(function() {
  for (var property in $(this).data()) {
    if (property.indexOf('fooBar') == 0) {
      return true;
    }
  }

  return false;
});​

请注意,data-foo-bar 已转换为 fooBar

演示:http://jsfiddle.net/Tyj49/3/

【讨论】:

  • 我非常熟悉 jQuery。这些选择器匹配给定属性的,而不是属性名称。
  • 这个看起来更好。如果您只想缓存过滤的对象以供以后使用,您可以这样做:jsfiddle.net/Tyj49/4 虽然我猜从长远来看,重新构想该方法可能会更好(在不知道用例的情况下很难说),这肯定会获得投票。
  • 你为什么不在这里检查 hasOwnProperty ?
【解决方案2】:

我不确定你能做到这一点。我看过 API,您似乎只能对值进行更深入的部分匹配,而不是属性名称本身。

我会给你一个可能令人沮丧的建议,“不要这样做”。 ;-) 从本质上讲,您所追求的是一堆匹配更一般类别的 div。不仅仅是data-foo-bars,而是所有data-foos!为什么不给所有的 data-foos 一个你可以从中选择的类名,或者一个单独的属性,比如data-foo="true"

换句话说,与其严格按照所问的问题,我很想知道用例是什么,以便横向思考可以同样有效地解决您的问题。给猫剥皮的多种方法等等。

【讨论】:

  • 好吧,我的替代方案是拥有 2 个数据属性。但我想如果有意愿就有办法,所以我想到了stackoverflow。 :)
【解决方案3】:

这只是一种替代解决方案。 如果您可以确保您要查找的属性名称不存在于元素文本中,您可以做的是获取元素的 outerHtml 值,然后进行子字符串搜索:

$("elementsToCheck").each(function () {
    var elemHtml = $('<div>').append($(this).clone()).html(); //clone to get the outerHTML
    if (elemHtml.indexOf("attributeName") >= 0) {
        // current element contains the attribute with name "attributeName"
    }
});

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    试试这个

    $().ready(function() {  
      var test=$('#div_test').data("foo-bar");
      alert(test);
    });
    

    HTML:

    <div data-foo-bar="hello" id="div_test"></div>
    

    【讨论】:

    • 天哪,它似乎有效。可能值得进行一些反例测试,看看它是否脆弱,但它正在发挥作用:jsfiddle.net/YkTJy
    • 疯了。在看到您的评论@GregPettit 之前,我几乎投了反对票。这将教会我草率下结论。
    • @Brogrammer:等等,你的问题似乎是说你想匹配部分data-foo,而不是完整的data-foo-bar。这不正确吗?
    • Hrm,毕竟我认为它没有多大用处。它将返回 foo-bar 的第一个值,但它不能全部返回它们,并且不会让您使用 foo-bar 获取 jQuery 对象数组。所以它不会满足 OP 的需求。
    • 是的,部分。不知道我是怎么漏掉这个测试不是部分的。可能与早上 6 点左右有关。呸。
    【解决方案5】:

    使用.data()获取一个元素的所有数据属性,然后使用.filter获取具有data-validation*属性的元素。

    var validated_elements = $("p").filter(function() {
        var found = false;
        $.each($(this).data(function(key) {
            if (key.match(/^data-validation/)) {
                found = true;
                return false;
            }
        }
        return found;
    });
    

    【讨论】:

      【解决方案6】:

      试试这样的

      var element = $('div[data-foo-bar=hello]')​;
      

      【讨论】:

      • 不知道为什么这会被投票否决,这似乎是迄今为止最简单的有效概念jsfiddle.net/wHuV2
      • OP 正在尝试匹配属性 name,而不是实际值。这个问题有点模棱两可。
      • 了解值但属性远比4行过滤器简单
      • 我不知道“踩踏”。它没有为问题提供解决方案,因此对我来说是一个否决票。事实上,它使问题更加复杂,因为现在它不仅选择了 data-foo-bars,而且选择了值为“hello”的 data-foo-bars。 ;-)
      • 当您删除被否决的答案时,您总能恢复您的声誉。
      猜你喜欢
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2012-02-06
      • 1970-01-01
      相关资源
      最近更新 更多