addEventListener 为同一个表单触发多次
addEventListener firing multiple times for the same form
这是我的 Javascript 模块:
const Calculator = (function() {
return {
listen: function (formId) {
this.formId = formId;
this.calculatorForm = document.querySelector(`#form_${this.formId}`);
if (this.calculatorForm) {
this.addEventListeners();
}
},
addEventListeners: function() {
const self = this;
this.calculatorForm.addEventListener('submit', function(event) {
console.log('calculatorForm submit', self);
self.calculatorSubmission(event);
}, false);
},
calculatorSubmission: function(event) {
event.preventDefault();
console.log('Form submitted', this.calculatorForm);
}
};
})();
export default Calculator;
我使用 Webpack 构建了所有 Javascript,因此我可以像这样加载模块:
import Calculator from './modules/calculator';
加载 Javascript 的相关页面包含标签内容。每个选项卡都包含不同的表格,所有表格都使用计算器模块,因此当我在选项卡之间切换时,我调用:
Calculator.listen('form-id');
我遇到的问题是我在选项卡之间切换了几次。假设我查看选项卡 3、5 次,然后在选项卡 3 中填写并提交表单。表单提交了 5 次,因为每次查看选项卡 3 时都会调用 addEventListener。有意义吗?
我正在努力修复它 - 可能是因为我已经看了几个小时了,现在我的脑袋已经糊了。
是我的模块设置有问题吗?
解决我的问题的最佳方法是什么?
谢谢
我已经将我的计算器更新为 class,这似乎可以正常工作了。
欢迎任何改进!
class Calculator {
constructor() {
if (!Calculator.instance) {
Calculator.instance = this;
}
this.calculatorSubmissionHandler = function(event) {
Calculator.instance.calculatorSubmission(event);
};
return Calculator.instance;
}
listen(formId) {
this.formId = formId;
this.calculatorForm = document.querySelector(`#${this.formId}`);
if (this.calculatorForm) {
this.addEventListeners();
}
}
addEventListeners() {
this.calculatorForm.addEventListener('submit', this.calculatorSubmissionHandler, false);
}
calculatorSubmission(event) {
event.preventDefault();
console.log('Form submitted', Calculator.instance.formId);
}
}
这是我的 Javascript 模块:
const Calculator = (function() {
return {
listen: function (formId) {
this.formId = formId;
this.calculatorForm = document.querySelector(`#form_${this.formId}`);
if (this.calculatorForm) {
this.addEventListeners();
}
},
addEventListeners: function() {
const self = this;
this.calculatorForm.addEventListener('submit', function(event) {
console.log('calculatorForm submit', self);
self.calculatorSubmission(event);
}, false);
},
calculatorSubmission: function(event) {
event.preventDefault();
console.log('Form submitted', this.calculatorForm);
}
};
})();
export default Calculator;
我使用 Webpack 构建了所有 Javascript,因此我可以像这样加载模块:
import Calculator from './modules/calculator';
加载 Javascript 的相关页面包含标签内容。每个选项卡都包含不同的表格,所有表格都使用计算器模块,因此当我在选项卡之间切换时,我调用:
Calculator.listen('form-id');
我遇到的问题是我在选项卡之间切换了几次。假设我查看选项卡 3、5 次,然后在选项卡 3 中填写并提交表单。表单提交了 5 次,因为每次查看选项卡 3 时都会调用 addEventListener。有意义吗?
我正在努力修复它 - 可能是因为我已经看了几个小时了,现在我的脑袋已经糊了。
是我的模块设置有问题吗?
解决我的问题的最佳方法是什么?
谢谢
我已经将我的计算器更新为 class,这似乎可以正常工作了。
欢迎任何改进!
class Calculator {
constructor() {
if (!Calculator.instance) {
Calculator.instance = this;
}
this.calculatorSubmissionHandler = function(event) {
Calculator.instance.calculatorSubmission(event);
};
return Calculator.instance;
}
listen(formId) {
this.formId = formId;
this.calculatorForm = document.querySelector(`#${this.formId}`);
if (this.calculatorForm) {
this.addEventListeners();
}
}
addEventListeners() {
this.calculatorForm.addEventListener('submit', this.calculatorSubmissionHandler, false);
}
calculatorSubmission(event) {
event.preventDefault();
console.log('Form submitted', Calculator.instance.formId);
}
}