【问题标题】:Find every first instance of the first dynamic class of element with jquery使用 jquery 查找第一个动态元素类的每个第一个实例
【发布时间】:2016-05-27 18:42:14
【问题描述】:

我有以下html结构:

<div class="wrap">
  <div class="201610 generic-class"></div>
  <div class="201612 generic-class"></div>
  <div class="201612 generic-class"></div>
  <div class="201613 generic-class"></div>
  <div class="201613 generic-class"></div>
</div>

以“2016”开头的类是动态类,我事先不知道全名,虽然这个第一位总是一样的。此类在循环中可能会出现多次,也可能不会出现。

问题:使用 JQuery,我如何定位每个 .wrap &gt; div 的第一个类的每个第一个实例?

不确定这是否有帮助,但我尝试了以下方法,但从未得到超过动态类的单个第一个实例:

var theClass= $j('.wrap > div').attr('class');
var split = theClass.split(' ');
var firstClass = split[0];

谢谢

【问题讨论】:

  • "every first instance of first class of each .wrap &gt; div" 是什么意思?如果您告诉我们您期望的结果会是什么,这将有很大的帮助
  • 真的不清楚你想做什么。与使用数据属性相比,首先将它们用作类可能是一种将它们添加到 DOM 的糟糕方法

标签: jquery class dynamic instance target


【解决方案1】:

如果 “每个.wrap &gt; div 的第一个类的每个第一个实例”,您的意思是这些:

<div class="wrap">
  <div class="201610 generic-class"></div><!-- This one -->
  <div class="201612 generic-class"></div><!-- This one -->
  <div class="201612 generic-class"></div>
  <div class="201613 generic-class"></div><!-- This one -->
  <div class="201613 generic-class"></div>
</div>

最简单的方法就是循环。如果只有一个 .wrap,那么一个循环就足够了:

var seen = Object.create(null);
$(".wrap > div").each(function() {
    var theClass = this.className.match(/\b2016\d+\b/)[0];
    if (theClass && !seen[theClass]) {
        seen[theClass] = true;
        // ...do something with it here
    }
});

seen 对象让我们可以为之前看到的每个类名保留标志,这样我们就知道何时查看第一个。

正则表达式/\b2016\d+\b/ 将匹配任何以2016 开头并且后面只有数字的类名(\b 是“单词边界”断言)。这将与您所拥有的相匹配,但也与其他长度相匹配,例如 20161201612。如果您想完全匹配六位数(根据您的示例),请改用 /\b2016\d{2}\b/

实例:

var seen = Object.create(null);
$(".wrap > div").each(function() {
  var theClass = this.className.match(/\b2016\d+\b/)[0];
  if (theClass && !seen[theClass]) {
    seen[theClass] = true;
    // ...do something with it here, I'll turn its text green
    $(this).css("color", "green");
  }
});
<div class="wrap">
  <div class="201610 generic-class">201610</div>
  <div class="201612 generic-class">201612</div>
  <div class="201612 generic-class">201612</div>
  <div class="201613 generic-class">201613</div>
  <div class="201613 generic-class">201613</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

如果有多个 .wrap 元素,那么你需要一个外循环:

$(".wrap").each(function() {
    var seen = Object.create(null);
    $(this).children("div").each(function() {
        var theClass = this.className.match(/\b2016\d+\b/)[0];
        if (theClass && !seen[theClass]) {
            seen[theClass] = true;
            // ...do something with it here
        }
    });
});

实例:

$(".wrap").each(function() {
  var seen = Object.create(null);
  $(this).children("div").each(function() {
    var theClass = this.className.match(/\b2016\d+\b/)[0];
    if (theClass && !seen[theClass]) {
      seen[theClass] = true;
      // ...do something with it here; I'll turn its text green:
      $(this).css("color", "green");
    }
  });
});
<div>First wrap:</div>
<div class="wrap">
  <div class="201610 generic-class">201610</div>
  <div class="201612 generic-class">201612</div>
  <div class="201612 generic-class">201612</div>
  <div class="201613 generic-class">201613</div>
  <div class="201613 generic-class">201613</div>
</div>
<div>Second wrap:</div>
<div class="wrap">
  <div class="201610 generic-class">201610</div>
  <div class="201612 generic-class">201612</div>
  <div class="201612 generic-class">201612</div>
  <div class="201613 generic-class">201613</div>
  <div class="201613 generic-class">201613</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

【讨论】:

  • 这真是太棒了!如果我的问题令人困惑,我很抱歉,但我尽量保持抽象,这样会更清楚。没用,我以后会记住的!也不打算花这么长时间来回答!无论如何,你的第一个例子很棒,这正是我正在寻找的,我最终将它与 /\b2016\d{5}\b/ 一起使用了 9 个字符,希望这是正确的。很明显,您是一位非常有经验的用户,我非常感谢您花时间回答这个问题。非常感谢!
  • @Tiago:是的,如果你有(比如)201602135,那么\b2016\d{5}\b 是完全正确的。很高兴有帮助!
猜你喜欢
  • 2011-11-07
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2013-02-09
  • 2016-05-11
  • 2017-12-27
  • 1970-01-01
相关资源
最近更新 更多