按钮点击对某些元素不起作用

button onclicks not working on certain elements

提问人:grevans 提问时间:11/16/2023 最后编辑:grevans 更新时间:11/17/2023 访问量:50

问:

我正在用 JavaScript 制作一个游戏。我正在尝试创建一个带有元素的按钮并将其附加到场景中。我已经在几个地方这样做了,但现在代码失败了。这是不起作用的(简化)代码:onclick

const testme = document.createElement('input');
  testme.type = 'button';
  testme.value = 'click me';
  testme.addEventListener('click', () => {
    alert('clicked');
  });
  outputElement.appendChild(testme);

该按钮将呈现,但单击它不会触发效果。如果我不使用匿名函数,即它按预期运行(仅运行一次代码)。testme.addEventListener('click', alert('clicked'));

如果我将元素附加到 document.body(按钮工作正常。输出是给出的普通 div 我有其他函数使用这些函数,这些函数工作正常:document.body.appendChild(testme)const outputElement = document.getElementById('output');outputElement.appendChild

function chooseName() {
  const nameInput = document.createElement('input');
  nameInput.type = 'text';
  nameInput.id = 'name-input';
  nameInput.addEventListener('keydown', (event) => {
    if (event.key === 'Enter') {
      const playerName = nameInput.value.trim();
      if (playerName !== '') {
        setPlayerName(playerName);
        output(`Your name is ${getPlayerName()}`);
        gameState = 'chooseOccupation';
        document.getElementById('name-input').remove();
        promptOccupation();
      } else {
        output('Please enter a valid name.');
      }
    }
  });

  outputElement.appendChild(nameInput);
  nameInput.focus();
}
  const occupations = [
    'Archaeologist', 'Astrologer', 'Brewer', 'Burglar', 'Clergyman', 'Courier',
    'Dramatist', 'Ditch digger', 'Forester', 'Gambler', 'Hangman', 'Healer',
    'Jeweler', 'Netmaker', 'Ostler', 'Scribe', 'Taxidermist', 'Trapper',
    'Undertaker', 'Weaver'
  ];

  const occupationList = document.createElement('div');
  for (occupation of occupations) {
    const occupationButton = document.createElement('p');
    const job = occupation;
    occupationButton.textContent = occupation;
    occupationButton.classList.add('clickable-text');
    occupationButton.addEventListener('click', () => chooseOccupation(job));
    occupationList.appendChild(occupationButton);
  }
  outputElement.appendChild(occupationList);

不幸的是,由于这个项目太大了(5+ 个文件,数百个 LoC),我不确定如何制作一个可重现的例子。我希望有人能告诉我可能是什么原因造成的,因为坦率地说,我没有想法,而且不是一个优秀的 JavaScript 程序员。

编辑: 我注意到如果我将测试放在chooseName()之前,如下所示:

function chooseName() {
  const testme = document.createElement('input');
  testme.type = 'button';
  testme.value = 'click me';
  testme.addEventListener('click', () => {
    alert('clicked');
  });

  const nameInput = document.createElement('input');
  nameInput.type = 'text';
  nameInput.id = 'name-input';
  outputElement.appendChild(testme);
  nameInput.addEventListener('keydown', (event) => {
    if (event.key === 'Enter') {
      const playerName = nameInput.value.trim();
      if (playerName !== '') {
        setPlayerName(playerName);
        output(`Your name is ${getPlayerName()}`);
        gameState = 'chooseOccupation';
        document.getElementById('name-input').remove();
        promptOccupation();
      } else {
        output('Please enter a valid name.');
      }
    }
  });

它有效,但前提是我在输入名称之前单击测试按钮。输入名称后,测试按钮不起作用。

JavaScript DOM onclick 事件处理

评论

0赞 grevans 11/16/2023
@MisterJojo stackoverflow.com/help/how-to-answer
0赞 Mister Jojo 11/16/2023
我毫不怀疑你可能会遇到你所指出的问题,但你的问题没有得到足够的支持,无法让你重现你的问题,甚至无法提出答案的假设。这里没有任何东西可以重现这个问题。
0赞 Barmar 11/17/2023
“在chooseName()之前进行测试”是什么意思?什么测试?
0赞 Barmar 11/17/2023
当第二个参数不是函数时,它会像任何其他函数参数一样立即执行,而不是在单击时执行。addEventListener()
1赞 Barmar 11/17/2023
除非你能发布一个最小的可重现的例子来证明这个问题,否则我们将很难弄清楚。

答:

0赞 grevans 11/17/2023 #1

我的函数是修改outputElement的innerHTML,这会破坏侦听器。使用代替解决了我的问题。output()outputElement.insertAdjacentHTML()