【问题标题】:How to change all elements in specific class that are dynamically created?如何更改特定类中动态创建的所有元素?
【发布时间】:2017-08-06 08:38:13
【问题描述】:

当悬停在此类中的一个元素上时,我试图突出显示使用 JavaScript 从数组中动态创建的同一类的所有元素(person1、person2 等)。 F.e.如果我将鼠标悬停在带有 class: person1 的元素上,我希望所有带有 class: person1 的元素都被突出显示。主要问题是,当我将参数添加到添加 onmouseover 的 highlightGen 函数(将是 highlightGen(j) )然后根据情况通过此变量对每个 person1、person2、person3 工作时,该函数将停止一起工作.到目前为止,这是我想出的。

[更新]:我已经尝试过您的示例,但是当我向 highlightGen 函数添加参数时会出现相同的效果 - 没有响应。我附上了codepen,所以也许有人能弄清楚为什么它没有响应mouseenter。

https://codepen.io/mmsmsy/pen/zZddZz

jQuery UI 功能:

function highlightGen() {
    $(this).addClass('hovered', 300);
}

function highlightGenNot() {
    $(this).removeClass('hovered', 300);
}

以及从数组创建元素的 JavaScript 循环中的部分代码:

        var div = document.createElement('div');
        var divIdInitial = tree[j].name.toLowerCase();
        var find = ["ą","ć","ę","ł","ń","ó","ś","ź","ż"," "];
        var replace = ["a","c","e","l","n","o","s","z","z",""];
        var divId = divIdInitial.replaceArray(find,replace) + tree[j].genNum;
        div.setAttribute('id',divId);
        var divClass = 'person person' + tree[j].genNum;
        div.setAttribute('class',divClass);
        div.onmouseover = highlightGen;
        div.onmouseout = highlightGenNot;

【问题讨论】:

  • 为什么不只是在悬停时更改类...所以悬停在任何 person1 上做例如$('.person1').css('background', 'red'); 然后在鼠标移出时将其删除
  • 这确实有效,但是我如何使该函数同时为其他类分别工作,如 person2、person3 等。
  • 悬停在person1 上时,如果您想影响更多类,那么只需:$('.person1, .person2, .person2').css('background', 'red');
  • 没有。我想将鼠标悬停在任何 .person1 元素上并影响所有且仅影响 .person1 元素。当悬停在任何 .person2 元素上以影响所有且仅影响 .person2 元素时,依此类推。
  • 将鼠标悬停在任何 person2 上,例如$('.person2').css('background', 'red');

标签: javascript jquery arrays highlight


【解决方案1】:

您可以使用闭包来传递另一个参数来突出显示,如下所示:

function highlightGen(className, addOrRemove) {
    $('.' + className).toggleClass('hovered', addOrRemove); // if addOrRemove is true then add the class, else remove it (http://api.jquery.com/toggleClass/)
}

然后像这样设置事件监听器:

// ...
var theClass = 'person' + tree[j].genNum;
div.className = 'person ' + theClass;      // className is better
div.onmouseenter = function() {            // onmouseenter is better
    highlightGen(theClass, true);          // add the class
}
div.onmouseleave = function() {            // onmouseleave is better
    highlightGen(theClass, false);         // remove it
}

注意 1: 那么您可以删除函数 highlightGen,因为它现在没用了,只需将其代码直接放在事件侦听器中(由您决定)。

注意 2: 如果您已经在使用 jQuery,那么为什么不使用它来创建元素并设置它们的属性,而不是使用普通的 js(createElementonmouseenter,... )?

示例:

function highlightGen(className, addOrRemove) {
  $('.' + className).toggleClass('hovered', addOrRemove);
}

function generate() {
  var div = document.createElement("div");
  var theClass = 'person' + Math.floor(Math.random() * 3 + 1);
  div.className = 'person ' + theClass;
  div.textContent = "DIV." + theClass;
  div.onmouseenter = function() {
    highlightGen(theClass, true);
  }
  div.onmouseleave = function() {
    highlightGen(theClass, false);
  }
  return div;
}

// generate some testing divs
for(var i = 0; i < 20; i++)
  $("#container").append(generate());
.hovered {
  background-color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container"></div>

【讨论】:

  • 看起来像一个优雅的解决方案你的代码,谢谢。我正在尝试在 vanilla JS 中做所有事情来学习我能做的事情,到目前为止,除了这部分之外,我使用的唯一 jQuery 是让它看起来更好一点的动画。但是,我在使用您的解决方案时仍然遇到问题,就像我在添加参数时遇到问题一样。它只是停止做任何事情。我在整个网页中添加了 codepen,也许可以为您提供更多解决方案。谢谢。
  • @MateuszMysiak 伙计,我花了一年时间才找到它!您没有以正确的方式复制代码。您将highlightGen 的代码放在highlightGen 中(函数中的函数=> 错误)。修复它,它将正确添加类.hovered。并为 .hovered 类添加一些样式!
  • 已更正。它现在正在做某事,但现在它总是影响到最后一代。看起来它应该添加所有单独的类,但是每当突出显示任何人时,该函数总是突出显示最后一个人类元素(在本例中为 person6)。我已经更新了 CodePen。
  • 嘘!是的,我忘记了,我打算在第一条评论中提到这一点。这是您的problem提示: 带有索引 jwhile 循环围绕着生成 div 的代码!。
  • @MateuszMysiak 我推荐这个answer!将代码while(j &lt; tree.length) { /*code*/ j++;} 更改为while(j &lt; tree.length) { (function(j) { /*code*/ })(j); j++} 或使用forEach,例如:tree.forEach(function(t, j) { /*code*/ }) 并去掉while
猜你喜欢
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2017-10-24
  • 2013-08-18
  • 2019-01-02
相关资源
最近更新 更多