You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无ID元素定位方案:Kahoot谷歌扩展昵称过滤开发求助

解决Kahoot昵称过滤扩展的元素定位问题

你当前用getElementsByClassName绑定固定类名的思路有问题——Kahoot的这类长串类名(比如controller-entry__ControllerName-sc-sqj4to-1 onogI)是动态生成的,页面更新或版本迭代后就会失效,不能作为稳定的定位依据。下面给你几个实用的解决办法:

方案1:基于元素结构+语义特征定位

Kahoot的玩家条目结构有固定的语义规律,你可以用模糊类名匹配+层级选择器来定位昵称元素,示例代码:

// 用MutationObserver监听页面DOM变化,替代死循环
const observer = new MutationObserver(() => {
  // 定位所有玩家昵称元素:父容器含controller-entry前缀,子元素含Name前缀
  const nameElements = document.querySelectorAll('[class*="controller-entry"] [class*="Name"]');
  nameElements.forEach(el => {
    const nickname = el.textContent.trim();
    // 替换成你的不良词汇检测逻辑
    if (nickname.includes('不良词汇')) {
      el.textContent = '[已过滤]';
      // 也可以直接隐藏整个玩家条目
      el.closest('[class*="controller-entry"]').style.display = 'none';
    }
  });
});

// 监听页面主体的DOM变化
observer.observe(document.body, { childList: true, subtree: true });

方案2:利用关联元素反向定位

如果结构定位还是不稳定,可结合玩家条目的关联元素(比如头像、分数块)反向找昵称:

// 找到所有玩家头像元素,取相邻的昵称节点
const avatars = document.querySelectorAll('[class*="Avatar"]');
avatars.forEach(avatar => {
  const nameEl = avatar.nextElementSibling;
  if (nameEl) {
    const nickname = nameEl.textContent.trim();
    // 执行过滤逻辑
  }
});

关键优化:替换死循环为MutationObserver

你写的while(true)会直接卡死浏览器,必须换成MutationObserver——它只会在页面新增玩家条目时触发过滤逻辑,性能友好得多,上面的示例已经用到了这个方法。

额外实用提示

  • 调试时可以在Chrome开发者工具的Elements面板,右键昵称元素选「Copy > Copy selector」,把生成的选择器里的动态类名改成[class*="xxx"]的模糊匹配格式
  • 可以把不良词汇存进数组,用正则批量检测:
    const badWords = ['词1', '词2', '词3'];
    const badWordRegex = new RegExp(badWords.join('|'), 'i');
    if (badWordRegex.test(nickname)) {
      // 执行过滤操作
    }
    

内容的提问来源于stack exchange,提问作者Husky-boi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:53:21