window.addEventListener两个弹窗,第一个弹窗返回值,第二个弹窗返回值使第一个弹窗的值丢失
时间: 2023-08-12 08:07:46 浏览: 153
在使用 `window.addEventListener` 添加事件监听器时,如果第二个弹窗的返回值使第一个弹窗的值丢失,可能是因为第一个弹窗的事件监听器没有被正确地清除。当第一个弹窗弹出时,JavaScript 代码会等待用户的响应,并在用户响应后执行事件监听器的回调函数。如果在第一个弹窗弹出后,没有正确地清除事件监听器,那么当第二个弹窗弹出时,第一个事件监听器的回调函数仍然会被执行,从而覆盖第一个弹窗的返回值。
为了解决这个问题,可以在第一个弹窗关闭后,立即清除事件监听器,然后再弹出第二个弹窗。例如:
```javascript
function showDialog() {
return new Promise((resolve, reject) => {
const onClick = (event) => {
window.removeEventListener('click', onClick);
resolve(event.target);
};
window.addEventListener('click', onClick);
});
}
async function run() {
const result1 = await showDialog();
window.removeEventListener('click', onClick); // 清除第一个弹窗的事件监听器
const result2 = await showDialog();
console.log(result1, result2);
}
run();
```
在上面的代码中,`showDialog` 函数返回一个 `Promise` 对象,在该对象的回调函数中添加事件监听器,并在用户点击页面时调用 `resolve` 函数返回事件的目标元素。在 `run` 函数中,使用 `async/await` 语法依次弹出两个弹窗,并在第一个弹窗关闭后,立即清除事件监听器,然后再弹出第二个弹窗。这样就可以避免第二个弹窗的返回值使第一个弹窗的值丢失的问题。
阅读全文