您提供的代码是一个用户脚本(UserScript),用于自动关闭在特定网站上出现的关于团队套餐续订失败的弹窗。这个脚本使用了MutationObserver API来监视DOM的变化,一旦检测到包含特定关键词的弹窗,就会尝试关闭它。以下是代码的详细分析以及一些改进建议:

代码分析

  1. 定义关键词:脚本首先定义了一个关键词数组KEYWORDS,包含'团队套餐续订失败'、'工作空间将于'和'停用'。这些关键词用于检测是否存在续订失败的弹窗。
  2. MutationObserver:使用MutationObserver来监视整个文档的DOM变化。当检测到变化时,会执行回调函数,该函数会检查所有div元素,看它们是否包含上述关键词。
  3. 关闭弹窗:如果检测到弹窗,脚本会尝试找到并点击弹窗中的关闭按钮(button元素)。如果找不到关闭按钮,则直接移除该div元素。

改进建议

  1. 精确匹配关键词:当前脚本使用includes方法检查关键词,这可能导致误匹配。建议使用正则表达式来更精确地匹配关键词,确保只响应特定的弹窗文本。
  2. 提高性能:当前脚本对所有div元素进行遍历,这可能在元素数量较多时影响性能。可以考虑使用更具体的选择器来缩小搜索范围,或者使用document.querySelector来直接定位可能的弹窗元素。
  3. 异常处理:脚本中缺少异常处理逻辑。例如,如果querySelectorclick方法失败,可能会抛出错误。建议添加适当的错误处理来增强脚本的健壮性。
  4. 用户配置:可以考虑添加用户配置选项,允许用户自定义关键词或启用/禁用自动关闭功能,以提供更好的用户体验。

示例代码改进

const KEYWORDS = [
    /团队套餐续订失败/,
    /工作空间将于/,
    /停用/,
];

const observer = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
        if (mutation.type === 'childList') {
            mutation.addedNodes.forEach((node) => {
                if (node.nodeType === Node.ELEMENT_NODE) {
                    const text = node.innerText || '';
                    if (KEYWORDS.some(k => k.test(text))) {
                        console.log('[AutoClose] 检测到续订弹窗');
                        const closeBtn = node.querySelector('.close-button');
                        if (closeBtn) {
                            closeBtn.click();
                        } else {
                            node.remove();
                        }
                    }
                }
            });
        }
    });
});

observer.observe(document.body, {
    childList: true,
    subtree: true,
});

以上是对您提供的脚本的详细分析和改进建议。希望这些建议能帮助您优化脚本,提高其性能和可靠性。

标签: none

评论已关闭