这在 DOM 和事件监听器中

this in the DOM and event listeners

有人可以告诉我如何重构没有“this”的 JavaScript 以解释在浏览器上下文中使用“this”的方式吗? (请不要用 jQuery 答案回答以下问题)

我已经将e(事件)传递给回调函数并实现了:
e.target.classList.toggle("活跃");
var 面板 = e.target.nextElementSibling;

我实施的方法奏效了。但是我想知道 benefit/why 你会在显示的上下文中使用“this”,它似乎不像 e.target 那样具有声明性。这是函数绑定问题吗?

(片段下方的其他片段相关问题)

我从 W3schools 中获取了以下代码片段,它用于创建手风琴菜单:

var acc = document.getElementsByClassName("accordion");
var i;

for (i = 0; i < acc.length; i++) {
  acc[i].addEventListener("click", function() {
    /* Toggle between adding and removing the "active" class,
    to highlight the button that controls the panel */
    this.classList.toggle("active");

    /* Toggle between hiding and showing the active panel */
    var panel = this.nextElementSibling;
    if (panel.style.display === "block") {
      panel.style.display = "none";
    } else {
      panel.style.display = "block";
    }
  });
}
/* Style the buttons that are used to open and close the accordion panel */
.accordion {
  background-color: #eee;
  color: #444;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  text-align: left;
  border: none;
  outline: none;
  transition: 0.4s;
}

/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
.active, .accordion:hover {
  background-color: #ccc;
}

/* Style the accordion panel. Note: hidden by default */
.panel {
  padding: 0 18px;
  background-color: white;
  display: none;
  overflow: hidden;
}
<button class="accordion">Section 1</button>
<div class="panel">
  <p>Lorem ipsum...</p>
</div>

<button class="accordion">Section 2</button>
<div class="panel">
  <p>Lorem ipsum...</p>
</div>

<button class="accordion">Section 3</button>
<div class="panel">
  <p>Lorem ipsum...</p>
</div>

谁能解释一下循环和事件监听器之间的关系?

按照我的理解,我希望:
每次 DOM 是 altered/reloads =>
循环运行=>
在每个 html 集合元素上添加一个事件侦听器=>
如果 HTML 元素被点击 == true(或者)事件被触发
class 切换为活动
下面的 if 语句被执行,样式可能会也可能不会内联应用到 html 元素。 这似乎是一种计算量大的添加事件侦听器的方法。

我写的上述陈述是否正确,如果不是到底发生了什么?
有没有更有效的方法来编写事件侦听器循环片段?
IE。也许在包含元素上使用事件冒泡?

这是一个简单的 HTML 布局:

<main>
  <div class='A'></div>
  <section></section>
  <div class='B'></div>
  <section></section>
  <div class='C'></div>
</main>

这里是 JavaScript 使用称为 Event Delegation 的编程范例:

document.querySelector('main').addEventListener('click', eventHandler);

因为大多数事件冒泡(点击冒泡),事件监听器应该注册到你想通过事件控制的标签的祖先标签(在这个例子中是<main>)(在此示例中,它是 .A.B.C)。现在事件处理程序:

function eventHandler(event) {
  const listener = event.currentTarget; // or `this` points to `<main>`
  const clicked = event.target; // This is the tag user actually clicked
    ....

我们需要准确控制什么对点击有反应,什么在点击时没有反应。我们可以使用 if/if elseswitch() 甚至三元组将事件委托给我们想要的,同时排除我们不想要的。在 eventHandler(e)...

内继续
....
  // All <section>s and even <main> is excluded
  if (clicked.matches('div')) {
    
    if (clicked.matches('.A')) {
       clicked.style.background = 'red';
    }
    if (clicked.matches('.C') {
       clicked.style.background = 'blue';
    }
  }
  // .B was never mentioned with any specific intructions so it's also excluded.
 }

下面的示例与之前的解释几乎相同的委托方案,除了使用 adjacent sibling combinator:

的额外 CSS 技巧
.accordion.active+.panel {
  display: block;
}

每当一个按钮是 .active 时,它后面的 .panel 就会消失。

document.body.addEventListener("click", togglePanel);

function togglePanel(e) {
  const clk = e.target;

  if (clk.matches('.accordion')) {
    clk.classList.toggle("active");
  }
};
.accordion {
  background-color: #eee;
  color: #444;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  text-align: left;
  border: none;
  outline: none;
  transition: 0.4s;
}

.active,
.accordion:hover {
  background-color: #ccc;
}

.panel {
  padding: 0 18px;
  background-color: white;
  display: none;
  overflow: hidden;
}

.accordion.active+.panel {
  display: block;
}
<button class="accordion">Section 1</button>
<div class="panel">
  <p>Lorem ipsum...</p>
</div>

<button class="accordion">Section 2</button>
<div class="panel">
  <p>Lorem ipsum...</p>
</div>

<button class="accordion">Section 3</button>
<div class="panel">
  <p>Lorem ipsum...</p>
</div>