javascript - 为什么 Javascript 不能与 Django HTML 一起使用?
问题描述
我正在尝试在我的 Django 网站中添加一些 javascript 代码。javascript 代码应该检查按钮是否被按下并提醒用户是否按下。但是,这只适用于第一个按钮。因为我循环显示所有按钮,所以我认为 javascript 没有将其视为 HTML 代码。这是javascript代码。
const card = document.querySelector('.card');
card.addEventListener('click', e => {
if (e.target.classList.contains('btn')) {
alert('hi')
}
})
这是 HTML/Django 代码:
{% extends "/Users/marco/Documents/codes/Python/Django/vracenmasse/templates/base_generic.html" %}
{% load static %}
{% block content %}
<center><h1>Nos Produits</h1></center>
<hr>
<div class="row" style = "border: 50px solid white;">
{% for product in products %}
<div class="card" style="width: 18rem;">
<img class="card-img-top" src="../../../media/{{ product.product_picture.name }}" alt="{{ product.product_picture.name }}">
<div class="card-body">
<center>
<h5 class="card-title">{{ product.name }}</h5>
<p class="card-text">{{ product.product_price|floatformat:2 }}$ / unité</p>
<p class="card-text">Catégorie : {{ product.type_of_product }}</p>
{% if product.new_product == "yes" %}
<b><p class="card-text"><font size="3.5" color="Orange">Nouveaux!</font></p></b>
{% endif %}
{% if product.availability == "Out Of Stock"%}
<b><p class="card-text"><font size="1.5" color="red">En rupture de stock</font></p></b>
<hr>
<button type="button" class="btn btn-primary" disabled>Ajouter au Panier</button>
{% else %}
<p style="font-size:15;">Quantité : </p><input type="number" step="12" min="0" />
<span class="validity"></span>
<hr>
<button type="button" class="btn btn-outline-primary" id='realbutton'>Ajouter au Panier</button>
{% endif %}
<div class="alert alert-success alert-dismissible fade show" role="alert" style ="visibility:hidden;">
<center>Produit ajouté au panier!</center><button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
</center>
</div>
</div>
{% endfor %}
</div>
</div>
<script src="{% static "products/buttonalerts.js" %}"></script>
{% endblock %}
第一个按钮是唯一有效的。我们可以在第 6 行看到有 for 循环。它遍历所有产品并添加自己的“添加到购物车”按钮。警报仅适用于第一个按钮。谢谢你。
解决方案
问题是您正在为列表中的每个产品创建一个“div”元素,但 querySelector() 方法只返回具有指定类的第一个元素。
您需要使用 querySelectorAll() 方法获取包含所有元素的列表,然后将事件侦听器应用于每个元素:
const cards = document.querySelectorAll('.card');
for (let i = 0; i < cards.length; i++) {
cards[i].addEventListener('click', e => {
if (e.target.classList.contains('btn')) {
alert('hi')
}
}
)
另一种解决方案是直接查询包含“btn”类的元素并将事件侦听器添加到这些元素中:
const buttons = document.querySelectorAll(".btn");
for (let i = 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', function() {
alert('hi');
}
)
推荐阅读
- tensorflow - 文件转换为 TensorFlow 带来错误结果,转换为 TFLite 带来错误消息
- unity3d - 跳跃后如何保持玩家动力(2D)?
- javascript - 同步导航栏和部分以显示活动类,同时用户使用部分向下滚动页面
- ethereum - eth_sendTransaction 不存在/不可用
- c# - 为什么 CreateProcess 忽略 STARTUPINFO 窗口大小值?
- javascript - 如何使用反应路由器创建动态路由
- axios - 在ajax方法之后在vue 3中渲染菜单
- c# - 使用 AES 加密解密 SQL Server 数据库
- spring-boot - 如何从实体访问 Spring 属性?
- java - 需要解决托管在云中的 REST API 的 504 错误