表单内部事件无法向上传播的问题求助
表单内部事件无法向上传播的问题求助
各位大佬求助!我遇到一个离谱到炸的问题——用了整整4年的老代码突然罢工了!这4年来我一直靠同一段逻辑:在contenteditable的span元素上监听回车按键,触发submit事件后让它冒泡到外层的form上,一直都稳得一批。结果就在一小时前,这逻辑突然失效了,form完全接收不到span传上来的submit事件!
我赶紧写了个极简的测试用例排查问题:
<form id="form"> <span id="input">input</span> </form> <script> // 用来打印事件触发信息的函数 function log(event){ const logEl = document.createElement("div"); logEl.textContent = `${event.target.nodeName} ${event.type}`; document.body.appendChild(logEl); } // 给form绑定submit监听 form.addEventListener("submit", log); // 手动触发submit事件的函数 function propagate(input){ // 给span触发带冒泡的submit事件 input.dispatchEvent(new Event("submit", {bubbles: true})); // 给父元素也触发一次 input.parentNode.dispatchEvent(new Event("submit", {bubbles: true})); } // 执行触发逻辑 propagate(input); </script>
我还做了个对比测试:把外层的form换成div,结果完全正常——能打印出SPAN submit和DIV submit两行日志。但换回form之后,就只输出FORM submit这一行,span触发的submit事件仿佛凭空消失了一样!
我一直以为,只要事件设置了bubbles: true,就会顺着DOM树向上冒泡,作为父元素的form没道理接不到啊?而且这逻辑跑了4年都没出问题,突然就不行了,我实在摸不着头脑。难道submit事件在form元素上有什么特殊的冒泡规则?还是说我之前4年都是“误打误撞”才生效的?
- 预期结果:页面上打印两行内容:
SPAN submit、FORM submit - 实际结果:只打印出
FORM submit一行
内容来源于stack exchange
相关产品推荐
相关产品推荐

