如何将单击事件处理程序添加到从 javascript 创建的 userChat 类

Posted

技术标签:

【中文标题】如何将单击事件处理程序添加到从 javascript 创建的 userChat 类【英文标题】:how to add a click event handler to my userChat class created from javascript 【发布时间】:2020-11-03 14:55:27 【问题描述】:

我用 javascript 创建了一个名为 userChat 的类,我希望能够向 userChat 类添加一个单击事件处理程序,以便当我单击 userChat 时,它会向我发送我正在单击的用户的名称,问题是我添加了一个 addEventListener 但它不起作用,我不知道我做错了什么,请你帮帮我,非常感谢。

    function updateUsers(socket)   
    socket.on('updateUsers',function(data)       
        let usuarios = document.querySelector('#usuarios');
        usuarios.innerhtml='';
        for(let i = 0; i < data.users.length; i++)
            let us = `<div class ="userChat">` +data.users[i] +`</div>`;
            usuarios.innerHTML += us;
            

            let userchat = document.querySelector('.userChat');
            userchat.addEventListener('click',function()
            console.log('estas tocando al usuario: '+data.users[i]);
            );
               
    );
    

【问题讨论】:

你能在这里详细说明“不工作”吗——你会收到错误吗? 您需要使用事件委托。这个问题之前已经回答过了。例如,这里:***.com/questions/34896106/… 如果它不适合你,那一定是因为它包含了socket.io并表达了自己。当我从 javascript 创建一个 html 标记时,我需要它,在这种情况下,我的 userChat 类必须添加一个单击事件处理程序,但我的不起作用,我不知道该怎么做 【参考方案1】:

您正在尝试将事件侦听器添加到刚刚在 js 中创建的元素(在本例中为let us = ...)。您应该将此侦听器添加到已在 DOM 中的此元素的父级,然后您可以检查此单击是否由您的元素触发。换句话说,您需要将此事件“委托”给父元素(事件委托)。例如:

 <parent-element>.addEventListener('click', function (e) 
   if (e.target && e.target.classList.contains('userChat')) 
     //do something
   
 );

【讨论】:

在这种情况下,是否允许用户使用 usuarios.addEventListener('click', function (e) if (e.target && e.target.classList.contains('userChat')) //做点什么 ); "usuarios" 也在 JS 中在你的函数开始时创建,所以它也不起作用。您应该找到一个已经在 DOM 中的元素!也许是“usuarios”的父元素。【参考方案2】:

试试这个方法

let us = `<div class ="userChat" onclick='getUser(data.users[0])'>` +data.users[i] +`</div>`;


function getUser(user)
  // user

【讨论】:

这会弹出聊天:1 Uncaught ReferenceError: getUser is not defined at HTMLDivElement.onclick (chat:1)

以上是关于如何将单击事件处理程序添加到从 javascript 创建的 userChat 类的主要内容,如果未能解决你的问题,请参考以下文章

将事件添加到从服务器FullCalendar返回的事件数组中

如何将事件和其他参数传递给单击处理程序

将带有事件处理程序的绘图添加到空布局

通过单击按钮向 ComboBox 添加值

如何实现 WM_LBUTTONCLICK 事件处理程序

带有 mousedown 事件处理程序的 AngularJS 指令,但单击事件永远不会触发