首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >classList.add()、classList.remove()和classList.toggle()实际上并没有改变classList

classList.add()、classList.remove()和classList.toggle()实际上并没有改变classList
EN

Stack Overflow用户
提问于 2020-10-01 21:10:55
回答 1查看 124关注 0票数 0

我让以下代码从单击事件侦听器函数中执行

代码语言:javascript
复制
if (target.tagName === 'LABEL'){
    
    if (target.classList.contains('active')){
        console.log('removing')
        target.classList.remove('active')
    }

    else {
        console.log('adding')
        console.log(target.classList)
        target.classList.add("active");
        console.log(target.classList)
    }
}

在Chrome和Firefox中,问题是它实际上并没有添加这个类,我不知道为什么。

同样的代码可以在其他地方运行,但在这一特定部分中它不能运行。

以下是我从控制台获得的内容

代码语言:javascript
复制
click registered 

LABEL 

adding 

DOMTokenList(3)
​
0: "topic-label"
​
1: "btn"
​
2: "initialized"
​
length: 3
​
value: "topic-label btn initialized"
​
<prototype>: DOMTokenListPrototype { item: item(), contains: contains(), add: add(), … }

DOMTokenList(4)
​
0: "topic-label"
​
1: "btn"
​
2: "initialized"
​
length: 3
​
value: "topic-label btn initialized"
​
<prototype>: DOMTokenListPrototype { item: item(), contains: contains(), add: add(), … }

最小化DOMTokenList我看到了以下内容

代码语言:javascript
复制
click registered 

LABEL 

adding 

DOMTokenList(3) [ "topic-label", "btn", "initialized" ]


DOMTokenList(4) [ "topic-label", "btn", "initialized", "active" ]

我可以看到我正确地进入了代码的该区域,并且我可以看到DomTokenList发生了变化-但实际的classList没有变化。

我甚至不知道如何开始搜索这个,所以也许有人知道发生了什么?

提前谢谢。RR

更多细节

下面是完整的事件侦听器方法

代码语言:javascript
复制
function initialize_topics(){

    var all_topics = byClass('topic-label')
    
    for (var i=0; i< all_topics.length; i++){
        
        if (all_topics[i].classList.contains('initialized')){
            continue
        }
        else{
            all_topics[i].classList.add('initialized');
            all_topics[i].addEventListener("click", function(e){
                //console.log('click registered')
                e=e || window.event;
                var target = e.target || e.srcElement;
               
                //console.log(target.tagName)        

                
                if (target.tagName === "LABEL"){
                    /*
                    if (target.classList.contains('active')){
                        console.log('removing')
                        target.classList.remove('active')
                    }

                    else {
                        console.log('adding')
                        console.log(target.classList)
                        target.classList.add("active");
                        console.log(target.classList)
                    }
                    */
                    console.log(target.firstElementChild.value)
                    console.log(target.classList)
                    target.classList.toggle('active')
                    console.log(target.classList)

                }
            });

        }
        
    }

}

这就是我在这里的目标HTML

代码语言:javascript
复制
<div class="lurnby_data_group topics-group" data-toggle="buttons">
   <h6 class="inline-block">Topics:</h6>
   <span  id="CreateTopic">
       <button onclick ="NewTopic()" class="main-button save">
            Create new topic
       </button>
   </span><br>
   <div class = "topics-all">
      {% for topic in topics %}
      <label class="topic-label btn">
         <input name = "topics" type="checkbox" value="{{topic.title}}">
         {{topic.title}}
      </label>
      {% endfor %}
      <span id = "topicplaceholder"></span>
   </div>
</div>

它似乎也不能在Chrome上运行。这里有一个小的视频,你可以看到更多的发生了什么。

https://www.loom.com/share/12703437f9a04d4e9ef44d3c933353de

这是我现在在控制台中得到的东西。我首先记录输入的值,然后记录类列表,然后切换到“active”,然后再次记录类列表。

问题是更改实际上并没有被推送到DOM。

代码语言:javascript
复制
test 
DOMTokenList(3) [ "topic-label", "btn", "initialized" ]

DOMTokenList(4) [ "topic-label", "btn", "initialized", "active" ]

hellop 
DOMTokenList(3) [ "topic-label", "btn", "initialized" ]

DOMTokenList(4) [ "topic-label", "btn", "initialized", "active" ]

所有的元素都有监听器-

另一个更新

问题可能出在我重复使用设置事件侦听器的函数调用上。但我不明白为什么这会导致这个问题,因为我实际上并没有再次设置事件侦听器。

当标签第一次添加事件侦听器时,我给它一个名为'initialized‘的类--任何时候调用函数时,它都会首先检查那个类,如果这个类不存在,它就会添加事件侦听器。

我这样做是因为我也在应用程序的其他地方使用相同的代码在ajax加载的模式中初始化类似的标签。

我不明白为什么这会引起某种冲突。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-10-01 22:13:36

尽管classList是只读的,但可以使用add()remove()toggle()方法对其进行更新。

add()和remove()在代码片段中工作得很好。您是否正在检入一些在线编辑器(如jsfiddle等)?

注意: IE9和较早版本的浏览器不支持classList。

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
<style>
.active {
  background-color: coral;
}
</style>
</head>
<body>

<button onclick="myFunction()">Try it</button>

<label id="myDIV">
I am a Label element
</label>

<script>
function myFunction() {
  
  let elem = document.getElementById("myDIV");
  if(elem.classList.contains("active"))
  {
    elem.classList.remove("active")
  }
  else
  {
    elem.classList.add("active");
  }
}
</script>

</body>
</html>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64156115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档