javascript - 将标识符添加到单独嵌套组中的重复类

标签 javascript jquery

在使用如下代码块时,我尝试向“duplicate-class”类的每个实例添加唯一的类名,该类与“affiliate-logo”类位于同一元素上。

重要说明:

  1. “duplicated-class”代表一个动态变量,可以是任何东西。
  2. 期望的结果是在重复的类后面附加一个数字(“.class-1”、“.class-2”、“.class-3”等......

这是代码结构的示例:

<div id="integrations">
<div class="post-item" data-name="name">
    <div class="rss-card" style="">
        <div class="hs-rss-item">
            <div class="rss-item-banner">
                <img class="hs-rss-featured-image" src="" alt="">
                <div class="affiliate-logo duplicate-class"><img src="" alt=""></div>
            </div>
        </div>
    </div>
</div>

<div class="post-item" data-name="name">
    <div class="rss-card" style="">
        <div class="hs-rss-item">
            <div class="rss-item-banner">
                <img class="hs-rss-featured-image" src="" alt="">
                <div class="affiliate-logo duplicate-class"><img src="" alt=""></div>
            </div>
        </div>
    </div>
</div>
<div class="post-item" data-name="name">
    <div class="rss-card" style="">
        <div class="hs-rss-item">
            <div class="rss-item-banner">
                <img class="hs-rss-featured-image" src="" alt="">
                <div class="affiliate-logo different-class"><img src="" alt=""></div>
            </div>
        </div>
    </div>
</div>
</div>

post-item 组是从 COS 列表中生成的,其中“duplicate-class”是从必须允许重复值条目的 {{name}} 值中提取的。

虽然我可以找到为包装 ID 的直接后代生成类列表的方法,但我似乎无法找到(或弄清楚)任何产生查找“重复类”的结果的方法,同时更深入地嵌套在生成的结果中。结构。

我最初的想法是:

  1. 识别后项
  2. 在每个 post-item 组中查找“.affiliate-logo”类
  3. 识别“.affiliate-logo”旁边的第二个类(在此示例中:.duplicate-class)并将其分配给变量 (var = approximationClass) <-- 这就是我对如何完成这项检查感到困惑的地方。
  4. 检查 (adjacentClass) 是否与其他 post-item 组中的任何其他 (adjacentClass) 匹配。
  5. 使用计数器充当唯一标识符添加 (var i = i)
  6. if(adjacentClass ===adjacentClass){ $(".duplicate-class').replaceClass('adjacentClass' + i) } else {}

(如果我能弄清楚步骤 3,我实际上会尝试用 javascript 编写该逻辑。)

如果您能就此问题提供任何帮助,我们将不胜感激。

<小时/>

我在尝试寻找解决方案时引用的文章:

How find nested div with same class name in jquery?

How do I access the list of classnames using javascript/jQuery?

jquery select class inside parent div

Target the 2nd instance of a CSS Class

** 进行编辑以修复术语冲突

最佳答案

更新2

在代码片段 2 中,我们使用了 .each() 两次。一次迭代每个 div.affiliate-logo,一次迭代每个 div.affiliate-logo 的第二个类。 for 循环会过滤掉存储在数组中的重复项。最困难的部分是OP遇到的麻烦是获得二等舱。方法如下:

$(this).prop('classList');

在纯 JavaScript 中,classList 是一个属性,当它不带任何 .add.remove 等使用时,它将返回一个数组classNames(在片段 2 的注释中,对此数组中的任何字符串的引用都将是“classString”)。

在全页模式下查看片段 2。详细信息请参见代码片段 2。

更新1

the first 'duplicate-class' becomes 'duplicate-class-1', the second becomes 'duplicate-class-2'

不确定您要做什么。我认为您认为类就像 DOM 对象一样,就像元素一样。查看代码片段并告诉我这是否是您想要的。

片段 1

$('.duplicate-class').each(function(idx, obj) {
  var unique = 'duplicate-class' + (idx + 1);
  $(this).addClass(unique)
  $(this).text('this is ' + unique); //This is just to show it works
});
div {
  border: 1px solid black;
  height: 40px;
  width: 200px;
  padding: 10px;
  color: white;
  background: rgba(0, 0, 0, .3);
}
.affiliate-logo {
  border: 2px dashed red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="integrations">
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo duplicate-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>

  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo duplicate-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo different-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

片段 2

// .each() .affiliate-logo do this...
$('.affiliate-logo').each(function(idx, obj) {

  /* Get the classList .prop()erty and store it
  || in a var called list. list is now an array
  || of classes that belong to this particular
  || .affiliate-logo.
  */
  var list = $(this).prop('classList');

  // Store the second classString in a var called second
  var second = list[1];

  /* Create an array with the classString of 'affiliate-  
  || logo' because we already know that it will be a
  || duplicate. Call this array dupes.
  */
  var dupes = ['affiliate-logo'];

  /* for every classString that's in dupes array
  || compare it to the value of second. If there's
  || a match bust out of this loop and go on to the
  || next .affiliate-logo.
  */
  for (let a = 0; a < dupes.length; a++) {
    if (second === dupes[a]) {
      return;
    }
  }

  /* Since there were no matches, we continue.
  || Push second in the dupes array so if ever found 
  || again, second will be rejected by the previous
  || for loop.
  */
  dupes.push(second);

  /* Concat second with a dot so it'll pass as a class
  || selector then store it in a var called klass.
  */
  var klass = '.' + second;

  // each() klass will...
  $(klass).each(function(index, item) {

    /* concat second + (current)index as a string 
    || then addClass() that string to the current 
    || div.affiliate-logo.{{klass}}
    */
    $(item).addClass(second + index);

    /* insert text that shows it's new class. The
    || new unique class can be verified by F12.
    */
    $(item).text('This is ' + second + index);
  });

});
div {
  border: 1px solid black;
  height: 40px;
  width: 200px;
  padding: 10px;
  color: white;
  background: rgba(0, 0, 0, .3);
}
.affiliate-logo {
  border: 2px dashed red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="integrations">
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo duplicate-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>

  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo duplicate-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo different-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo o-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo x-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo klass-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo a-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo dupe-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo bass-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo wrong-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo no-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo no-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo x-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo logo-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo long-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo x-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo duplicate-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo x-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo no-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="post-item" data-name="name">
    <div class="rss-card" style="">
      <div class="hs-rss-item">
        <div class="rss-item-banner">
          <img class="hs-rss-featured-image" src="" alt="">
          <div class="affiliate-logo no-class">
            <img src="" alt="">
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

关于javascript - 将标识符添加到单独嵌套组中的重复类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42122876/

相关文章:

javascript - 在 Vuejs 中使用 indexOf 方法

javascript - 值(value)观不会反射(reflect)出来

javascript - 发布并放入 Angular2

javascript - hide() 和 on() 在 Internet Explorer (IE) 上不起作用

javascript - Moment js返回负时间戳

javascript - 可扩展的 jQuery UI 对话框

javascript - 未捕获错误 : Syntax error, 无法识别的表达式:不支持的伪:标签

JQuery 更改所有元素文本

javascript - 使用 jQuery 库将点击事件附加到 DIV

javascript - 如何选择一个必须具有多个 css 类的元素?