如何在回车事件中获取按钮点击事件的Event对象?
问题分析与解决方案
你的核心问题是:回车触发的是keypress键盘事件,传递给logicTuoi_tinhTuoi的是键盘事件对象,而非按钮#tinhtuoi的click鼠标事件对象。如果$.fn.fireWorks(e)依赖鼠标事件的属性(比如pageX/pageY这类坐标信息),直接传键盘事件就会出问题。下面给两种可行方案:
方案一:直接触发按钮的点击事件(推荐)
不用手动传递事件对象,而是在回车时主动触发按钮的click事件,这样原有的点击事件处理逻辑会自动执行,同时传递正确的click事件对象。修改后的键盘事件代码如下:
$(document).on('keypress', '#divTinhTuoi', (e) => { if (e.which == 13){ // 触发按钮的click事件,自动携带click事件对象 $('#tinhtuoi').click(); // 阻止回车的默认行为(比如避免表单自动提交) e.preventDefault(); } })
这种方式不需要修改logicTuoi_tinhTuoi函数,完全复用原有点击逻辑,最简洁。
方案二:构造模拟的click事件对象(按需使用)
如果不想触发按钮的点击事件,也可以手动构造一个类似click事件的对象,传递给logicTuoi_tinhTuoi。比如如果fireWorks只需要鼠标位置,可以取按钮的坐标来模拟:
$(document).on('keypress', '#divTinhTuoi', (e) => { if (e.which == 13){ const btn = $('#tinhtuoi')[0]; // 构造模拟的click事件对象 const clickEvent = new MouseEvent('click', { pageX: btn.getBoundingClientRect().left + window.scrollX + btn.offsetWidth/2, pageY: btn.getBoundingClientRect().top + window.scrollY + btn.offsetHeight/2, bubbles: true, cancelable: true }); // 传递模拟的事件对象 $.fn.logicTuoi_tinhTuoi(clickEvent); e.preventDefault(); } })
这种方式适合需要自定义事件属性的场景,但代码相对繁琐,不如方案一简洁。
额外优化建议
如果logicTuoi_tinhTuoi函数里的fireWorks并不严格依赖完整的事件对象,只是需要触发位置,也可以重构函数,让它接受可选的位置参数,而不是直接依赖事件对象,这样兼容性更好。比如:
$.fn.logicTuoi_tinhTuoi = (eventOrPos) => { $('#tuoi').html($.fn.tinhTuoi()) if (!~$('#tuoi').text().indexOf('Lỗi')){ // 处理事件对象或位置参数 const fireworkOpts = typeof eventOrPos === 'object' && 'pageX' in eventOrPos ? eventOrPos : {pageX: eventOrPos.x, pageY: eventOrPos.y}; $.fn.fireWorks(fireworkOpts) $('#tuoi').effect('fade') }else $('#tuoi').effect('shake') }
内容的提问来源于stack exchange,提问作者Hưng Nguyễn
相关产品推荐
相关产品推荐

