【发布时间】:2020-05-08 12:09:27
【问题描述】:
我在同一页面上有一些 HTML 表单,在提交前一个表单之后,这些表单一个接一个地依次切换。用户可以在它们之间来回导航,因此我需要在它们被触发后移除提交事件侦听器,以便在需要时重新附加它们。
我目前在“渲染过程”中为它们中的每一个附加提交事件处理程序,在执行如下函数后删除事件处理程序:
form.addEventListener('submit', submitStepOne)
function submitStepOne(e) {
e.preventDefault()
sendData()
form.removeEventListener('submit', submitStepOne)
}
多个表单元素的代码相同(submitStepTwo、submitStepThree...)
因为我不想一直重复相同的代码,所以我想创建一个全局的“提交步骤并转到下一个”函数,我认为它可能看起来像这样:
const submitStep = (event, stepNo, trigger) => {
event.preventDefault()
toggleStep(stepNo)
trigger.removeEventListener('submit', submitStep)
}
我想我可以像这样使用.bind() 将事件处理程序附加到提交按钮(来自https://stackoverflow.com/a/23024673/10727821 的提示):
PAGES.step3.functions = function() {
console.log('step 3')
let trigger = this.domElement.querySelector('form')
trigger.addEventListener('submit', submitStep.bind(null, event, 4, trigger))
}
PAGES 是一个对象,其中包含每个步骤的 DOM 元素以及每个页面的相应功能。每次使用toggleStep(step) 切换步骤时,都会调用PAGES.stepX.functions()。
但是,我收到了Uncaught TypeError: Cannot read property 'preventDefault' of undefined。我怎样才能重写函数,以便正确地向它传递参数?
感谢任何提示!
【问题讨论】:
标签: javascript html forms event-handling