1

我正在尝试将 onclick 事件分配给动态创建的面板元素:

for(var c = 0; c < data.length; c++) {
    var user = data[c];
    document.querySelector('#userList').innerHTML += '<li class="user" id="button-login-' + c + '"><img src="user.png" /><span>' + user.username + '</span></li>';
    document.querySelector('#button-login-' + c).onclick = function() {
        self.port.emit('button', {
            'action': 'login',
            'data': {
                'username': user.username
            }
        });
    };
}

但似乎第一个 onclick 事件被最后一个覆盖了......有什么帮助吗?

在新代码中,我尝试了这个:

for(var c = 0; c < data.length; c++) {
    user = data[c];
    document.querySelector('#userList').innerHTML += '<li class="user" id="button-login-' + c + '"><img src="user.png" /><span>' + user.username + '</span></li>';
    document.querySelector('#button-login-' + c).onclick = function() {
        self.port.emit('button', {
            'action': 'login',
            'data': {
                'username': user.username
            }
        });
    };
}

和这个:

for(var c = 0; c < data.length; c++) {
    let user = data[c];
    document.querySelector('#userList').innerHTML += '<li class="user" id="button-login-' + c + '"><img src="user.png" /><span>' + user.username + '</span></li>';
    document.querySelector('#button-login-' + c).onclick = function() {
        self.port.emit('button', {
            'action': 'login',
            'data': {
                'username': user.username
            }
        });
    };
}

按钮不起作用...

4

1 回答 1

2

这是因为闭包在 Javascript 中的工作方式,而不是特定于 sdk 或扩展的东西。

请参阅“在循环中创建闭包:一个常见错误”以获取问题的一般解决方案。

对于更简单的解决方案更改

var user = data[c];

let user = data[c];
于 2013-09-26T03:50:29.510 回答