如何快速定位自定义事件派发对应的JS文件及代码行
你不需要额外安装工具,用DevTools自带能力就能快速定位到派发自定义事件的代码位置,以下方法按操作便捷度排序:
方法1:基于现有监听位置直接查调用栈(零代码,最方便)
你既然已经能用monitorEvents($0)找到B.js里的事件监听回调位置,直接在该回调的第一行打个行断点:- 触发自定义事件,代码会自动断在你打的监听回调断点处
- 看DevTools右侧*Call Stack(调用栈)*面板,跳过标注为浏览器底层实现的栈帧(比如
dispatchEvent[native code] 这类条目),第一个属于你业务代码的栈帧,就是执行事件派发的位置 - 点击对应栈帧,会直接跳转到A.js中执行派发操作的第X行,行号精准对应。
方法2:控制台注入dispatchEvent拦截断点(适合找不到监听回调的场景)
打开DevTools控制台,执行以下代码,把其中your-custom-event-name替换成你要找的自定义事件名:const rawDispatch = EventTarget.prototype.dispatchEvent; EventTarget.prototype.dispatchEvent = function(ev) { if (ev.type === 'your-custom-event-name') debugger; return rawDispatch.call(this, ev); }注入完成后触发目标事件,代码会直接在派发动作执行的瞬间断住,当前停留的位置往上一层业务栈帧就是派发代码的准确位置,不需要等事件走到监听回调。
提示:所有标准事件、自定义事件的派发最终都会走
EventTarget.prototype.dispatchEvent原型方法,不存在漏拦截的情况,哪怕事件是在闭包、异步逻辑里派发的也能抓到。方法3:全局代码搜索(适合事件名硬编码的场景)
按Ctrl+Shift+F(Windows)/Cmd+Option+F(Mac)打开DevTools Sources面板的全局代码搜索框,直接输入你要找的自定义事件名,搜索结果会列出所有包含该事件名的代码片段,你可以快速过滤出带dispatchEvent调用的条目,直接跳转到对应文件和行号。如果事件名是动态拼接生成的,这个方法不适用。
注意:如果线上代码是压缩混淆后的,请确保已开启Source Map,否则定位到的行号和源代码无法对应。
内容的提问来源于stack exchange,提问作者Coen Bakker

