Vanilla Javascript:如何将多个事件侦听器添加到在 Django 中使用相同 class 动态创建的按钮?
Vanilla Javascript: How to add multiple event listeners to buttons which are dynamically created with same class in django?
我目前正在为 CS50w - 网络开展项目 4。其中一项任务是添加一个编辑 posts 按钮(用于编辑登录用户(仅所有者)创建的 posts),它执行此异步操作。由于存储 posts 我使用的是 Django 模型,我使用 Django(及其模板功能)也向用户显示所有 posts,以及一个编辑按钮(如果用户是post 的创建者)。我在 div 中显示所有 post。这意味着编辑按钮也是这个div的一部分......意味着我只能给它一个class或id来引用,但我不知道如何区分它们,以及如何知道单击了哪个(从哪个 post),以便我可以编辑 post 而不是 DOM 中的 JS 出现的第一个......无论如何,这是代码:
HTML 在 Django 中:
{% for post in posts %}
<div class="post">
<a href="{% url 'users' post.user.username %}">{{ post.user }}</a>
<p>{{ post.content }}</p>
<p>{{ post.created }}</p>
{% if user.is_authenticated and user == post.user %}
<button class="edit_post_button">Edit Post</button>
{% endif %}
</div>
<div class="edit_post" style="display: none;">
<a href="{% url 'users' post.user.username %}">{{ post.user }}</a>
<textarea rows=3 cols=20>{{ post.content }}</textarea>
<p>{{ post.created }}</p>
<button class="save_edit_post_button">Save</button>
</div>
{% endfor %}
这里是我写的小 JS,它不起作用(我才刚刚开始学习它,并且想用 vanilla JS 完成这个项目):
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.edit_post_button').forEach(edit_post_button => {
edit_post_button.addEventListener('click', edit_post);
})
});
function edit_post(event) {
document.querySelector('.post').style.display = 'none';
document.querySelector('edit_post').style.display = 'block';
}
授权就是答案
请注意,您在 document.querySelector('edit_post')
中忘记了一个点
window.addEventListener('load', function() {
document.getElementById('postContainer').addEventListener('click', function(e) {
const tgt = e.target.closest('.edit_post_button')
if (tgt) {
const postDiv = tgt.closest('.postDiv')
postDiv.querySelector('.post').hidden = true
postDiv.querySelector('.edit_post').hidden = false
console.log(tgt.dataset.id); // if needed
}
})
})
<div id="postContainer">
<div class="postDiv">
<div class="post">
<a href="User1URL">user 1</a>
<p>Post 1 </p>
<p>yesterday</p>
<button class="edit_post_button" data-id="postId1">Edit Post</button>
</div>
<div class="edit_post" hidden>
<a href="User1URL">user 1</a>
<textarea rows=3 cols=20>Post 1</textarea>
<p>Yesterday</p>
<button class="save_edit_post_button">Save</button>
</div>
</div>
<div class="postDiv">
<div class="post">
<a href="User2URL">user 2</a>
<p>Post 2 </p>
<p>yesterday</p>
<button class="edit_post_button" data-id="postId2">Edit Post</button>
</div>
<div class="edit_post" hidden>
<a href="User2URL">user 2</a>
<textarea rows=3 cols=20>Post 2</textarea>
<p>Yesterday</p>
<button class="save_edit_post_button">Save</button>
</div>
</div>
</div>
我目前正在为 CS50w - 网络开展项目 4。其中一项任务是添加一个编辑 posts 按钮(用于编辑登录用户(仅所有者)创建的 posts),它执行此异步操作。由于存储 posts 我使用的是 Django 模型,我使用 Django(及其模板功能)也向用户显示所有 posts,以及一个编辑按钮(如果用户是post 的创建者)。我在 div 中显示所有 post。这意味着编辑按钮也是这个div的一部分......意味着我只能给它一个class或id来引用,但我不知道如何区分它们,以及如何知道单击了哪个(从哪个 post),以便我可以编辑 post 而不是 DOM 中的 JS 出现的第一个......无论如何,这是代码:
HTML 在 Django 中:
{% for post in posts %}
<div class="post">
<a href="{% url 'users' post.user.username %}">{{ post.user }}</a>
<p>{{ post.content }}</p>
<p>{{ post.created }}</p>
{% if user.is_authenticated and user == post.user %}
<button class="edit_post_button">Edit Post</button>
{% endif %}
</div>
<div class="edit_post" style="display: none;">
<a href="{% url 'users' post.user.username %}">{{ post.user }}</a>
<textarea rows=3 cols=20>{{ post.content }}</textarea>
<p>{{ post.created }}</p>
<button class="save_edit_post_button">Save</button>
</div>
{% endfor %}
这里是我写的小 JS,它不起作用(我才刚刚开始学习它,并且想用 vanilla JS 完成这个项目):
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.edit_post_button').forEach(edit_post_button => {
edit_post_button.addEventListener('click', edit_post);
})
});
function edit_post(event) {
document.querySelector('.post').style.display = 'none';
document.querySelector('edit_post').style.display = 'block';
}
授权就是答案
请注意,您在 document.querySelector('edit_post')
window.addEventListener('load', function() {
document.getElementById('postContainer').addEventListener('click', function(e) {
const tgt = e.target.closest('.edit_post_button')
if (tgt) {
const postDiv = tgt.closest('.postDiv')
postDiv.querySelector('.post').hidden = true
postDiv.querySelector('.edit_post').hidden = false
console.log(tgt.dataset.id); // if needed
}
})
})
<div id="postContainer">
<div class="postDiv">
<div class="post">
<a href="User1URL">user 1</a>
<p>Post 1 </p>
<p>yesterday</p>
<button class="edit_post_button" data-id="postId1">Edit Post</button>
</div>
<div class="edit_post" hidden>
<a href="User1URL">user 1</a>
<textarea rows=3 cols=20>Post 1</textarea>
<p>Yesterday</p>
<button class="save_edit_post_button">Save</button>
</div>
</div>
<div class="postDiv">
<div class="post">
<a href="User2URL">user 2</a>
<p>Post 2 </p>
<p>yesterday</p>
<button class="edit_post_button" data-id="postId2">Edit Post</button>
</div>
<div class="edit_post" hidden>
<a href="User2URL">user 2</a>
<textarea rows=3 cols=20>Post 2</textarea>
<p>Yesterday</p>
<button class="save_edit_post_button">Save</button>
</div>
</div>
</div>