我在附加课程时遇到困难

I'm having difficulty appending a class

本文关键字:遇到 程时      更新时间:2023-09-26

我最初想不出一种方法将一个额外的类附加到具有其他 li 元素具有的类的 li 元素中。我只想向我单击选择按钮的特定 li 元素添加一个类,解决方案是"单击按钮时,您可以使用 .closest(( 查找祖先 li 元素"。该解决方案是一个jquery解决方案,它工作正常,但现在我遇到了一个额外的问题。首先,这是我最初发布的内容以及我与小提琴一起得到的解决方案,然后我将解释我的新问题是什么,并将不胜感激。所以我的原始帖子:

"好的,所以我的脚本允许我在文本区域元素中输入文本,并将其添加到 ID 为"Glist"的有序列表中的 li 元素中。不仅文本被添加到我添加到排序列表中的每个 li,而且还添加了下面的其他内容,它们都只是使用 CSS 显示额外的图像。其中一个类,"Selimg"显示一个按钮的精灵图像,上面写着"选择"。现在,我添加到ol中的每个li元素都具有以下所有元素以及类。因此,每个li元素都有一个带有"Selimg"类的div,该类显示一个按钮的图像,例如选择。当我用类 Selimg 单击这个div 时,一个名为"已选择"的新类将被添加到div 中,该类将更改 li 的背景颜色以指示它已被选中。问题是,我只想将"选定"类添加到带有我单击的 Selimg 类的div 中,而不是所有带有"Selimg"类的 li 元素。如何使用 onclick 事件处理程序或使用 js 或 jquery 的任何其他方式做到这一点?这是 html:

<ol id="GList">
   <li class="MyList">
      <p class="bulletp"></p>
      <!--This Selimg class displays an image of a button that says select-->
      <div class="Selimg"></div>
      <!--When a user presses this select button, I want to append a class only to the specific li element the user has pressed the select button on. -->
      <div class="edit1"></div>
      <div class="Del"></div>
      <div class="progress"></div>
      <div class="ShowMore"></div>
      <div class="CheckedGoal"></div>
      <div class="PCompetePercent"></div>
      <div class="ShowMoreBlock"></div>
      <div class="goalTxt"></div>
   </li>
</ol>
The solution I was given: 
"On the click of the button, you can use .closest() to find the ancestor li element"
$('.Selimg').click( function() {
   $(this).closest('li').addClass('someclasss')
   //or $(this).parent().addClass('someclasss') since the li is the parent of the button
})

这是演示解决方案的小提琴: http://jsfiddle.net/arunpjohny/fSMDv/2/

现在是新问题。出于某种原因,jquery 解决方案无法自行运行。不知何故,上面的jquery代码只有在我将其放入js函数中时才起作用,如下所示:

<script>
  function runSel() {
     var $li = $('.Selimg').closest('li').addClass('liselected');
     $li.siblings().removeClass('liselected');
  }
</script>

我还有一个函数,每当我想向列表中添加另一个项目时都会调用该函数。

//This is only the part of the code that creates the div that I style to look like and be used as a button that says select. There's more code that also creates the li element itself and a few additional things but all for design. Nothing important.
var Selimg = document.createElement('div'); 
Selimg.setAttribute("class", "Selimg");
Selimg.setAttribute("onclick", "runSel();");
entry.appendChild(Selimg);

这样做的作用是,使用类"Selimg"创建div,该类将是添加到我的列表项中的选择按钮的图像,然后赋予调用上面的runSel((函数的onclick属性,如您所见。它有效。但是,它只能工作一次。小提琴示例演示了我正在寻找的内容。所以现在,当我将一个项目添加到列表中,然后单击其上的选择按钮时,调用函数"runSel",它添加了一个名为"liselected"的类,并且liselected只是更改背景颜色,因为css中每个属性的规则都有"!important",所以背景颜色覆盖了当前颜色。它有效,但就像我说的,它只有效一次。在我添加另一个项目后,按该项目上的选择按钮(由 Selimg 类中的样式制成(,liselected 类将从另一个 li 元素中删除,但我刚刚单击选择按钮的第二个 li 元素,只会导致 liselect 类从第一个中删除,但之后不会添加到第二个 li 项, 当前的。因此,当我添加多个 li 时,它们将包含文本和div 等内容,样式看起来像一个说"选择"的按钮,因此当我在 li 上单击"选择"时,我希望该特定 li 附加 liselect 类,当我选择另一个 li 上的"选择"按钮时, 我希望从它所在的另一个 li 元素中删除类 liselect 并添加到该元素中。

jQuery 解决方案可以正常工作...问题是您正在处理动态创建的元素...所以需要使用事件委托

$(document).on('click', '.Selimg',  function() {
   $(this).closest('li').addClass('someclasss')
   //or $(this).parent().addClass('someclasss') since the li is the parent of the button
})

另外据我了解,您尚未在 dom 就绪处理程序中添加脚本

演示:小提琴

不知道你为什么要为这么小的问题写一本书。 我的意思是,我厌倦了在前 30 行没有触及问题重点之后阅读你写的内容。

使用:改用$(this).parent('li').addClass("...")

js小提琴