Javascript classList添加和删除在非全局执行上下文中不起作用

时间:2018-10-10 22:50:12

标签: javascript

我正在尝试通过创建具有3个exec上下文的堆栈来说明执行堆栈如何在Javascript上工作​​。全局,执行A和执行B。为此,我构建了一组嵌套的div并添加了displayNone类。

函数应该在运行时使用classList.remove('displayNone')删除displayNone类,并在setTimeout之后使用classList.add('displayNone')再次插入该类。

但是由于某种原因,它不起作用。如果我将classList命令带到全局上下文,它将正常工作。

HTML下方:

<button onclick="a()">Run function a</button>
<br>

<div class="global displayNone">
  <p>Este bloco está aparecendo devido a função executada no global execution context que removeu a classe displayNone desta div</p>
  <div class="executionA displayNone">
    <p>Este bloco só vai aparecer durante a execução do execution context da função A.</p>
    <div class="executionB displayNone">
      <p>Este bloco só vai aparecer durante a execução do execution context da função B.</p>
    </div>
  </div>
</div>

这是JS代码:

var content=document.getElementsByClassName('content')[0];
var globalDiv=document.getElementsByClassName('global')[0];
var execA=document.getElementsByClassName('executionA');
var execB=document.getElementsByClassName('executionB');

function rem(x){
  x[0].classList.remove('displayNone');
}
function add(x){
  x[0].classList.add('displayNone');
}


globalDiv.classList.remove('displayNone');
content.innerHTML="output results here";

function b(){
  content.innerHTML="function b executed";
rem(execB);
add(execB);
}

function a(){
  content.innerHTML="function a executed";
rem(execA);
  setTimeout(b,3000);
add(execA);
}

这是CodePen https://codepen.io/PierBotteroWeb/pen/OBmPPY?editors=1010

上的示例

1 个答案:

答案 0 :(得分:2)

它正在按预期方式工作,而不是您期望的那样。在rem(execA)rem(execB)下,您有add(execA)add(execB),因此可以有效地同时删除和添加类。这就是为什么您在屏幕上看不到任何更改的原因。

add(execA)add(execB)包装在setTimeout()中,然后查看其工作原理。