【问题标题】:How to add onclick event to dynamically generated HTML elements如何将 onclick 事件添加到动态生成的 HTML 元素
【发布时间】:2019-11-30 15:22:49
【问题描述】:

我正在尝试开发一个允许用户创建新聊天室的聊天应用程序。

我已经为列表中的每个项目运行了代码,单击时会将用户添加到新的 房间

Javascript:

document.querySelectorAll('.select-room').forEach(li => {
    li.onclick = () => {
        let newroom = li.innerHTML;
        if (newroom == room){
            msg = `You are already in ${room} room.`
            printSysMsg(msg);
        } else {
            leaveRoom(room);
            joinRoom(newroom);
            room = newroom;
        }
    }
});

HTML:

            <nav id='sidebar'>
            <h4>ROOMS</h4>
            <ul id='room_list' >
                {% for room in rooms %}
                    <li class = 'select-room'>{{ room }}</li>
                {% endfor %}
            </ul>                
        </nav>

但是,当我添加新房间时,我无法立即单击列表项来更改聊天室,我必须刷新页面。

任何帮助将不胜感激

【问题讨论】:

  • 您可以从下面的帖子中找到解决方案; stackoverflow.com/questions/16598213/…
  • @UgurVolkan 我不认为您的链接会有所帮助,因为那里的解决方案是用 jQuery 而不是香草 JS 编写的。 jQuery 具有完全不同的语法,并使用事件委托来解决此类问题。

标签: javascript html socket.io


【解决方案1】:

您必须再次将事件侦听器添加到您添加的每个元素。但不像 JakeCroth 试图解释的那样(至少如果我理解正确的话)。相反,请像这样尝试:

let lst = document.querySelector('.lst');
let btn = document.querySelector('.btn');

function addListItem() {
  let li = document.createElement('li');
  
  li.innerHTML = "New element";  
  li.addEventListener('click', testTheEventListener);
  lst.appendChild(li);
}

function testTheEventListener() {
  console.log("The event listener works!");
}

document.querySelectorAll('li').forEach(li => {
  li.addEventListener('click', () => {
    testTheEventListener();
  });
});
<ul class='lst'>
  <li class="listItem">First</li>
  <li class="listItem">Second</li>
  <li class="listItem">Third</li>
</ul>

<button onclick="addListItem()" class='btn'>Add item</button>

如您所见,我将事件侦听器添加到所有现有项目:

document.querySelectorAll('li').forEach(li => {
  li.addEventListener('click', () => {
    testTheEventListener();
  });
});

如果动态添加项目,我也会将事件侦听器添加到该项目。

function addListItem() {
  let li = document.createElement('li');

  li.innerHTML = "New element";  
  li.addEventListener('click', testTheEventListener); //<--
  lst.appendChild(li);
}

如果我理解错了,请随时纠正我。

【讨论】:

  • 你明白了吗?我没听错吗?
  • 是的,你没看错。我需要将事件侦听器添加到每个动态添加的项目中,以便它们获得该功能。只是添加这些代码行似乎会破坏它。不再添加链接。我想我只需要解决这个问题
  • 很高兴我能帮上忙。不要忘记将其标记为正确。
【解决方案2】:

您是否尝试过添加事件监听器?所以在你的 forEach 中:

document.querySelectorAll('.select-room').forEach(li => {
    li.addEventListener('click', () => {
        let newroom = li.innerHTML;
        if (newroom == room){
            msg = `You are already in ${room} room.`
            printSysMsg(msg);
        } else {
            leaveRoom(room);
            joinRoom(newroom);
            room = newroom;
        }
    })
});

【讨论】:

  • 这不起作用,因为元素是动态创建的。
  • 应该怎么做。它只是代码的另一种语法。
  • 嗨亚伦,我应该怎么联系你。添加新侦听器时代码中断
  • 我提供了答案。也许你可以看看。
猜你喜欢
  • 2019-11-13
  • 2010-12-04
  • 2018-04-22
  • 2013-12-26
  • 1970-01-01
  • 2012-10-08
  • 2013-05-04
  • 2023-03-06
  • 2011-08-11
相关资源
最近更新 更多