0

0

解决 Bookmarklet 仅触发第一个元素点击的问题

花韻仙語

花韻仙語

发布时间:2025-08-07 19:28:12

|

327人浏览过

|

来源于php中文网

原创

解决 bookmarklet 仅触发第一个元素点击的问题

Bookmarklet 在批量操作 GitHub 分支删除按钮时,仅触发第一个元素点击的问题,通常是由于点击事件触发后,后续的按钮被禁用导致。以下提供一种使用异步等待和 MutationObserver 机制解决此问题的方案。

问题分析

在 GitHub 的分支管理页面,当点击一个删除按钮时,页面会发起删除请求,并禁用其他删除按钮,防止并发操作。如果 Bookmarklet 快速地遍历所有按钮并触发点击事件,那么只有第一个按钮能够成功触发,后续的按钮由于被禁用而无法响应。

解决方案:使用异步等待和 MutationObserver

为了解决这个问题,我们需要在点击一个删除按钮后,等待该按钮变为可用状态,再点击下一个按钮。这可以通过结合 async/await 和 MutationObserver 来实现。

  1. waitTillNotDisabled 函数:

    这个函数使用 Promise 和 MutationObserver 来监听目标元素(删除按钮)的 disabled 属性变化。如果按钮当前处于禁用状态,MutationObserver 会持续观察 document.body 的子树变化,一旦检测到按钮不再被禁用,Promise 就会 resolve,从而允许程序继续执行。

    function waitTillNotDisabled(elm) {
        return new Promise(resolve => {
            if (!elm.disabled) {
                return resolve();
            }
    
            const observer = new MutationObserver(mutations => {
                if (!elm.disabled) {
                    resolve();
                    observer.disconnect();
                }
            });
    
            observer.observe(document.body, {
                childList: true,
                subtree: true
            });
        });
    }
  2. 主逻辑:

    知了追踪
    知了追踪

    AI智能信息助手,智能追踪你的兴趣资讯

    下载

    使用 document.querySelectorAll 找到所有符合条件的删除按钮。然后,使用 for 循环遍历这些按钮,并在每次迭代中使用 await waitTillNotDisabled(deleteButton) 来等待当前按钮变为可用状态。只有当按钮可用时,才会触发 deleteButton.click()。

    (async function(){
        function waitTillNotDisabled(elm) {
            return new Promise(resolve => {
                if (!elm.disabled) {
                    return resolve();
                }
    
                const observer = new MutationObserver(mutations => {
                    if (!elm.disabled) {
                        resolve();
                        observer.disconnect();
                    }
                });
    
                observer.observe(document.body, {
                    childList: true,
                    subtree: true
                });
            });
        }
    
        const deleteButtons = document.querySelectorAll('span[title="Status: Merged"], span[title="Status: Closed"]');
    
        for (let i=0;i
  3. 完整 Bookmarklet 代码:

    将以上代码封装成一个 Bookmarklet,方便在浏览器中直接使用。

    javascript:(async function(){
    function waitTillNotDisabled(elm) {
        return new Promise(resolve => {
            if (!elm.disabled) {
                return resolve();
            }
    
            const observer = new MutationObserver(mutations => {
                if (!elm.disabled) {
                    resolve();
                    observer.disconnect();
                }
            });
    
            observer.observe(document.body, {
                childList: true,
                subtree: true
            });
        });
    }
    
    const deleteButtons = document.querySelectorAll('span[title="Status: Merged"], span[title="Status: Closed"]');
    
    for (let i=0;i

使用方法

  1. 将以上代码复制到浏览器的地址栏中,并将其保存为书签。
  2. 打开 GitHub 的分支管理页面。
  3. 点击保存的书签,即可自动删除所有已合并或已关闭的分支。

注意事项

  • 此 Bookmarklet 依赖于 GitHub 页面结构的稳定性。如果 GitHub 页面结构发生变化,可能需要修改选择器。
  • 由于涉及到页面操作,请谨慎使用,并确保了解其行为。
  • 此方法通过等待按钮变为可用状态来避免并发问题,但可能会降低执行效率。

总结

通过结合 async/await 和 MutationObserver,可以有效地解决 Bookmarklet 在批量操作时遇到的并发问题。这种方法不仅适用于 GitHub 分支删除,还可以应用于其他类似的场景,例如批量点赞、批量关注等。关键在于理解页面行为,并使用适当的技术手段来处理异步操作和状态变化。

相关专题

更多
promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

296

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

391

2023.10.12

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

86

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

50

2025.12.26

wifi无ip分配
wifi无ip分配

本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

102

2025.12.26

漫蛙漫画入口网址
漫蛙漫画入口网址

本专题整合了漫蛙入口网址大全,阅读下面的文章领取更多入口。

297

2025.12.26

b站看视频入口合集
b站看视频入口合集

本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

592

2025.12.26

俄罗斯搜索引擎yandex入口汇总
俄罗斯搜索引擎yandex入口汇总

本专题整合了俄罗斯搜索引擎yandex相关入口合集,阅读下面的文章查看更多入口。

729

2025.12.26

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

63

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.3万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号