javascript - 从 Eloquent JavaScript 理解 eventListener 解决方案

标签 javascript function addeventlistener

非常感谢您的帮助,我已经尝试解决这个问题好几个小时了。

这就是我正在做的练习的解决方案:

<!doctype html>
<tab-panel>
<div data-tabname="one">Tab one</div>
<div data-tabname="two">Tab two</div>
<div data-tabname="three">Tab three</div>
</tab-panel>
<script>
function asTabs(node) {
let tabs = Array.from(node.children).map(node => {
  let button = document.createElement("button");
  button.textContent = node.getAttribute("data-tabname");
  let tab = {node, button};
  button.addEventListener("click", () => selectTab(tab));
  return tab;
});
let tabList = document.createElement("div");
for (let {button} of tabs) tabList.appendChild(button);
node.insertBefore(tabList, node.firstChild);

function selectTab(selectedTab) {
  for (let tab of tabs) {
    let selected = tab == selectedTab;
    console.log(selected)
    tab.node.style.display = selected ? "" : "none";
    tab.button.style.color = selected ? "red" : "";
  }
}
selectTab(tabs[0]);
}
asTabs(document.querySelector("tab-panel"));
</script>

让我困惑的部分在第 13 行:

button.addEventListener("click", () => selectTab(tab));

通常在添加事件监听器时,您不需要将一个函数调用放在另一个函数中 - 像这样说就足够了:

button.addEventListener("click", selectTab(tab));

但是当我这样做时,会出现一个错误:

ReferenceError: tabs is not defined (line 15 in function selectTab)
called from line 7 in function Array.from.map.node
called from line 3 in function asTabs
called from line 25

这就是我迷路的地方。 感谢您一如既往的抽出时间

最佳答案

Normally when adding event listeners, you wouldnt need to place a function call inside another function - it would be sufficient to say something like this:

button.addEventListener("click", selectTab(tab));

那不是真的。

addEventListener 的第二个参数必须是一个函数。该函数将在事件发生时被调用。

selectTab(tab) 调用 selectTab 函数立即(将 tab 变量的值传递给它) .只有当该函数的返回值是另一个函数时,您才能这样做。


However when I do, an error comes up saying:

ReferenceError: tabs is not defined (line 15 in function selectTab)

tabs 被定义,然后 Array.from 调用完成评估。事件监听器作为评估的一部分添加。即在将值分配给 tabs 之前。

关于javascript - 从 Eloquent JavaScript 理解 eventListener 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49163249/

相关文章:

typescript - 如何为 'layerX' 和 'layerY' 设置事件类型

javascript - Vanilla JavaScript + 多重选择 - 在多项选择中获得相同的值?

javascript - React Native 接收新的 props,componentWillReceiveProps

javascript - JavaScript AddEventListener 中的变量作用域

javascript - 我应该将 "document.getElementById("").innerHTML = "";"放在我的 Javascript 中的哪里?

c++ - 如何将包含 std::unique_ptr 的 std::optical 结构传递给函数?

javascript - React - setTimeout() 方法在 Promise.all 之后不触发

javascript - 如何以及在何处初始化 Backbone View 中的 jquery 数据表

function - gitlab ci 脚本功能失败时屏蔽 exit 1

javascript - 势不可挡的addEventListener