javascript - 动态 HTML 上的事件绑定,使用 fetch 和 forEach 内
问题描述
我正在尝试在下面显示的 HTML 元素上添加一个事件侦听器,在 forEach 循环中动态生成。我最初从 JSON 占位符 API 获得了正确的响应,但是,当我尝试事件时,在初始响应之后生成的任何 HTML 元素上绑定事件的尝试似乎都没有产生结果。
我要么根本没有“点击”,要么......addEventListener
不是一个函数,这取决于我把addEventListener
代码放在哪里。
有没有办法以一种干净且可重复使用的方式使这成为可能?另外,这是通过 vanilla JS 生成动态 HTML 的首选方式吗?或者我应该手动生成它,例如使用document.createElement()
和?appendChild()
最终,我的意思是将点击目标的 ID 传递给getPosts
函数获取 URL。
任何帮助将不胜感激!
fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(data => createResult(data));
function createResult(data) {
const container = document.getElementById('result');
data.forEach((user) => {
const { id, name, email, address: { city, street } } = user;
let result =
`<div class="user" data-uid=${id}>
<h5 id="user-${id}"> User ID: ${id} </h5>
<ul class="w3-ul">
<li> User Full Name : ${name}</li>
<li> User Email : ${email} </li>
<li> User Address : ${city}, ${street} </li>
</ul>
</div>`;
container.innerHTML += result;
document.body.addEventListener("click", function (e) {
if (e.target &&
e.target.classList.contains("user")) {
console.log('Clicked');
}
});
});
}
function getPosts(e) {
fetch(`https://jsonplaceholder.typicode.com/users/${user.id}`)
.then(res => res.json())
.then(data => console.log(data));
}
<div id=result></div>
解决方案
您应该使每个结果都成为一个元素并仅向该元素添加事件侦听器
let element = document.createElement('div')
element.innerHTML = result
element = element.firstChild
element.addEventListener("click", function (e) {
console.log('Clicked', element.getAttribute('data-uid'));
});
container.appendChild(element);
可运行示例
fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(data => createResult(data));
function createResult(data) {
const container = document.getElementById('result');
data.forEach((user) => {
const { id, name, email, address: { city, street } } = user;
let result =
`<div class="user" data-uid=${id}>
<h5 id="user-${id}"> User ID: ${id} </h5>
<ul class="w3-ul">
<li> User Full Name : ${name}</li>
<li> User Email : ${email} </li>
<li> User Address : ${city}, ${street} </li>
</ul>
</div>`;
let element = document.createElement('div')
element.innerHTML = result
element = element.firstChild
element.addEventListener("click", function (e) {
console.log('Clicked', element.getAttribute('data-uid'));
});
container.appendChild(element);
});
}
function getPosts(e) {
fetch(`https://jsonplaceholder.typicode.com/users/${user.id}`)
.then(res => res.json())
.then(data => console.log(data));
}
<div id=result></div>
推荐阅读
- python - 我正在尝试使用 AJAX 将已渲染的 Django 模板注入我的页面的一部分
- python - 将 Django 从 SQLite 转换为 PostgreSQL
- java - Spring - 显式 bean 实例化未设置 @Value 属性
- ios - NSLayoutConstraint - 两项,一行,间距优先
- android - 如何在改造 2 上发布整个数据库
- xamarin.forms - 未应用 CornerRadius
- r - 在 R dplyr 中按组将多列转换为相对频率
- apache-spark - 在 PySpark Structured Streaming 中为多个输出流使用单个流数据帧
- c - 从C中的void函数返回一个值
- javascript - addClass() 仅指向子元素(而不是嵌套元素)