【发布时间】:2022-01-26 03:19:57
【问题描述】:
我有一堆
<div class="location-box" data-location-id="123">
<img src="img_url" />
</div>
加载到我的.locations div 中。
我希望每当您单击 .location-box 时,单击的 div 会在其上突出显示类。并且属性值被添加到隐藏的输入中。当您单击另一个时,前一个中的类将被删除。以此类推。
我以前试过当那些 div 是静态的时,它工作得很好。但现在我从 api 调用中将这些 div 附加到纯 Javascript 之外。
我也知道尚未生成的 DOM 不能被事件监听器等操作。
我研究了变异观察者,并尝试了文档中的一些简单内容。但我可以让这段代码使用它
let locations = document.querySelectorAll(".location-box");
locations.forEach( el =>
el.addEventListener('click', function() {
locations.forEach( els => els.classList.remove('active-location'));
document.getElementById('location_id').value = this.getAttribute('data-location-id');
this.classList.add("active-location");
})
);
有谁知道如何进行这项工作?也许不仅是这一次,而且在许多情况下。因为在不久的将来我可能会有更多尚未生成的 DOM。
【问题讨论】:
-
你真的应该在呈现 HTML 的代码中处理它。也许在你“在 api 调用中使用 javascript 附加 div”时显示该代码。
-
@skara9 嗨,我试过这个``` document.querySelector('.locations').addEventListener('click', function(e){ if(e.target.className == 'location -box'){ 让位置 = document.querySelectorAll('.location-box'); locations.forEach(el => { el.classList.remove('active-location'); }); e.target.classList. add('active-location'); } });``` 它之前在另一个元素上的工作类似,但这次不是
-
好吗?看不出这和我说的有什么关系
-
@Coolguy31 ... 基于
MutationObserver的方法很可能是矫枉过正。 Event Delegation 可能是首选技术。但是为了以某种方式正确地实现它,很高兴知道所有后来渲染的东西是否总是插入/附加到一个公共且已知的根节点下方,因为document.body因为事件监听根也不是最优雅/高性能的选择. -
@Coolguy31 ...关于提供的答案/解决方案/方法还有什么问题吗?
标签: javascript html dom