javascript - 对象包含的元素上的事件侦听器
问题描述
我正在建立一个电子商务网站并采用 OOP 方法。我遇到了两难境地,我不太确定我能做些什么来解决这个问题..
所以我有一个类负责渲染购物车的视图,我们称之为 this CartView
,它还具有允许您从该购物车中添加和删除项目的功能,事件侦听器附加到添加/删除按钮。每次添加或删除时,购物车都会重新呈现并创建一个新的购物车。但是,与此同时,事件侦听器会再次添加到其中。所以每次,购物车都会重新渲染,另一个事件监听器会以越来越多的方式添加。因此,在购物车的第 5 次重新渲染时,每次点击都会触发 5 个事件。
我的代码示例: Store.js
Store.prototype.onUpdate = function(itemName) {
console.log('onUpdate');
console.log(this);
if (itemName) {
var cart = document.getElementById("modal-content");
var itemId = "product-" + itemName;
var container = document.getElementById("productView");
/*
Below program crashes if our productView does not contain the item, we need
a seperate communication with the server.
*/
if (!document.getElementById(itemId)) {
console.log(itemId + " does not exist in productView");
} else {
var currentItem = new ProductView(document.getElementById(itemId), this, itemName);
if (!nodeTraversal.findNode(container, document.getElementById(itemId))) {
console.log('element does not exist');
container.appendChild(currentItem);
} else {
console.log('element does exist');
var nodeToBeReplaced = document.getElementById("product-" + itemName);
nodeTraversal.findReplacedNode(container, document.getElementById(itemId), nodeToBeReplaced);
}
}
console.log('cart', cart.childNodes);
var cartView = new CartView(cart, this);
cartView.initEvents(cart, this);
} else {
var stock = Object.keys(this.stock)
var productsList = new ProductsView(document.getElementById("productView"), stock, this);
}
};
CartView.js
CartView.prototype.registerAddClickEventListeners = function(parent, storeInstance) {
console.log(parent);
console.log(parent.getAttribute('cartAddEvent'));
if (parent.getAttribute('cartAddEvent') !== 'true') {
console.log('Adding event for cart modal - add');
parent.addEventListener("click", addClickEventListener(storeInstance), {once : true});
}
}
function addClickEventListener(storeInstance) {
return function(e) {
if (e.target !== e.currentTarget && e.target.classList.contains("btn-add")) {
var product = e.target.parentNode.classList.item(0);
var elementClicked = e.target;
elementClicked.setAttribute('cartAddEvent', 'true');
storeInstance.addItemToCart(product);
storeInstance.timer.resetTimer();
}
e.stopPropagation();
}
}
我怎样才能使事件只添加一次?理想情况下,我希望使用纯 JavaScript 获得反馈。谢谢!
解决方案
推荐阅读
- c++ - 为什么捕获 lambda 在 C++ 中不起作用?
- python - Python 套接字中的断管
- python - 我不知道如何返回和打印函数结果。(我正在做一个python通讯录程序)
- php - 如何返回摘要字段 Silverstripe 中有许多数据?
- list - 反转的最佳解决方案是什么:附加双重列表和随机化?
- wordpress - 位置粘性不适用于 woof 产品过滤器
- typescript - onClick - 我怎样才能获得最近的元素
- java - 如何使用 JFrame 创建视频播放器?
- php - Amazon ElasticSearch Service 未知聚合类型箱线图
- minishift - 在 dhcp 租约文件中找不到 IP 地址 - minishift