【发布时间】:2021-07-06 09:17:53
【问题描述】:
我正在尝试将事件侦听器添加到由 django 模板标签创建的链接列表中。
它应该获取类 div.cat-link的对象列表,并为每个对象添加一个事件监听器以显示 div.cat-select的匹配ID
html
<div class="cat">
<div class="cat-links">
{% for t in tags %}
<div id="{{t|lower}}" class="cat-link">
<a class="cat" href="{% url 'list_product1' t %}">{{t}}</a>
</div>
{% endfor %}
</div>
</div>
<div class="cat-list">
{% for t in tags %}
<div class="cat-select" id="cat_{{t|lower}}">
{% for p in t.produto_set.all %}
<div class="cat-product">
<!--IMAGES-->
<div class='img'>
<amp-carousel lightbox controls autoplay delay="3000" width="250"
height="250" layout="responsive" type="slides">
{% for pic in p.images.all %}
<amp-img src="{{ pic.image.url }}" width="250" height="150"
layout="responsive" alt="{{ p.nome }}">
</amp-img>
{% endfor %}
</amp-carousel>
</div>
<!-- INFOS -->
<div class='infos-prod'>
<a class='cat-product' href="{% url 'detail_product' p.id %}">
<h3>{{p.nome}} </h3>
</a>
<a class='cat-product' href="{% url 'detail_product' p.id %}">
R$: {{ p.preco }}
</a>
</div>
</div>
{% endfor %}
</div>
{% endfor %}
</div>
JavaScript:
<script id="cat-script" type="text/javascript" target="amp-script">
function Showing(one) {
var v1 = document.getElementById(one);
v1.style.display = "flex";
};
function Hiding(one) {
var v1 = document.getElementById(one);
v1.style.display = "none";
};
function Category() {
var v1 = document.getElementsByClassName('cat-link');
for (o in v1) {
var v2 = 'cat_' + v1[o].getAttribute('id')
v1[o].addEventListener('mouseover', function () { Showing(v2) });
v1[o].addEventListener('mouseout', function () { Hiding(v2) });
};
};
Category()
</script>
它应该获取类 div.cat-link的对象列表,并为每个对象添加一个事件监听器以显示 div.cat-select的匹配id
我收到了错误:
未捕获的类型错误:v1[o].getAttribute 不是函数
什么都没有发生。
【问题讨论】:
-
不要在 HTMLCollection 上使用
for...in。如果您在循环中将o记录到控制台,您就会明白原因(o 有时是length、item、namedItem)。for (let o of v1) { let v2 = 'cat_' + o.id;应该会更好。 (注意:let,而不是var,以确保在事件处理程序中保留范围) -
我做得不好!!。非常感谢@blex。除了文档之外,您先生会推荐任何 JS 教程吗?
标签: javascript python django django-templates dom-events