gpt4 book ai didi

JavaScript addEventListener() 外部函数在没有事件的情况下触发

转载 作者:行者123 更新时间:2023-12-05 02:07:28 34 4
gpt4 key购买 nike

我正在绘制一个方框网格,希望能够单击每个方框并使用 SocketIO 将带有其 ID 的通知发送到服务器

<body>
<div class="wrapper">
<div id="1" class="box"></div>
<div id="2" class="box"></div>
</div>
</body>

let boxes = document.querySelectorAll('.box');

Array.from(boxes, function(box) {
box.addEventListener('click', function() {
id = box.id

//Send socketio message to server
socket.emit('box_event_client', {data: id});
});
});

这有效,我可以单击每个框并将事件发送到服务器,但显然这不允许删除偶数监听器,按照 https://www.w3schools.com/jsref/met_element_removeeventlistener.asp

注意:要删除事件处理程序,使用 addEventListener() 方法指定的函数必须是外部函数, 匿名函数,如“element.removeEventListener("event", function(){ myScript });"将不起作用。

所以我改成了这个

Array.from(boxes, function(box) {
box.addEventListener('click', addEL(box.id));
});

function addEL(boxID) {
console.log("Box clicked: " + boxID)

//Send socketio message to server
socket.emit('box', {data: boxID});
}

现在,一旦页面加载到浏览器中,网格中的所有框都会自动“单击”并将事件发送到服务器。

谁能帮助理解为什么会这样?

最佳答案

Can anyone help understand why this is happening?

Array.from(boxes, function(box) {
box.addEventListener('click', addEL(box.id));
});

addEL(box.id)函数调用,因此它获取 id 并在每个框的点击监听器附件上执行它

解决方案:

AddEventListener 需要事件名称和回调函数名称函数 本身(内联函数)

只需在参数中给出函数名称即可。

Array.from(boxes, function(box) {
box.addEventListener('click', addEL);
});

从类似event.currentTarget.id 的事件对象访问盒子的id

function addEL(event) {
let boxId=event.currentTarget.id
console.log("Box clicked: " + boxId)
//Send socketio message to server
socket.emit('box', {data: boxId});
}

关于JavaScript addEventListener() 外部函数在没有事件的情况下触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61751649/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com