Bookmarklet仅触发首个元素点击,无法批量删除Github已合并/关闭分支
问题原因与解决方法
为什么只删除第一个分支?
核心原因是页面动态更新打断了遍历流程。当你点击第一个删除按钮后,Github会动态修改DOM(比如移除已删除的分支行、重新渲染页面部分内容),这会让你一开始用querySelectorAll获取到的节点列表“失效”——后续的节点可能已经从DOM里消失,或者结构发生变化,导致遍历到后面的时候找不到对应的删除按钮,自然就只执行了第一次点击。
解决方法
换个思路,不要一次性获取所有按钮再遍历,而是循环查找并删除当前页面中第一个符合条件的分支,直到没有可删除的为止。这样每次删除后,页面更新完再重新找下一个,就不会受DOM变化影响了。
基础版脚本(需手动确认删除)
javascript:(async function(){ let deleteBtn; while(deleteBtn = document.querySelector('span[title="Status: Merged"], span[title="Status: Closed"]')?.parentNode?.parentNode?.querySelector('.js-branch-delete-button')){ deleteBtn.click(); // 等待页面完成动态更新,避免操作过快出错 await new Promise(resolve => setTimeout(resolve, 500)); } })()
进阶版脚本(自动确认删除)
如果希望自动处理删除确认弹窗,可以加上触发确认按钮的逻辑:
javascript:(async function(){ let deleteBtn; while(deleteBtn = document.querySelector('span[title="Status: Merged"], span[title="Status: Closed"]')?.parentNode?.parentNode?.querySelector('.js-branch-delete-button')){ deleteBtn.click(); // 等待删除确认弹窗加载完成 await new Promise(resolve => setTimeout(resolve, 300)); // 点击确认删除按钮 const confirmBtn = document.querySelector('.btn-danger.js-confirm-danger'); if(confirmBtn) confirmBtn.click(); // 等待页面更新,进入下一轮循环 await new Promise(resolve => setTimeout(resolve, 500)); } })()
原理说明
每次循环都会重新调用querySelector在当前DOM结构中查找第一个符合状态的分支对应的删除按钮,点击后等待页面完成动态更新,再继续查找下一个目标,直到找不到可删除的按钮为止,这样就能批量处理所有已合并/已关闭的分支。
内容的提问来源于stack exchange,提问作者Vlad Schnakovszki
相关产品推荐
相关产品推荐

