本次更新(commit: 7764aa3) 对 content.ts 文件进行了部分重构,详情如下:
- 重构 Shadow DOM 遍历逻辑,使用 WeakSet 避免重复遍历
- 新增页面变化检测机制,完美支持 PJAX/AJAX/SPA 等现代页面刷新方式
- 新增两段填充:DOM 加载前后,提升容错
Shadow DOM 遍历优化
const processedShadowRoots = new WeakSet<ShadowRoot>();
function traverseShadowDOM(root: Document | ShadowRoot | Element) {  // 如果 ShadowRoot 已经处理过,跳过  if (root instanceof ShadowRoot && processedShadowRoots.has(root)) {    return;  }
  // 标记已处理的 ShadowRoot  if (root instanceof ShadowRoot) {    processedShadowRoots.add(root);  }}页面变化检测机制
function setupAdvancedPageChangeDetection() {  // 监听浏览器前进后退  window.addEventListener('popstate', () => {    logger.info('检测到 popstate 事件');    handlePageChange();  });
  // 监听 PJAX、AJAX  const originalPushState = history.pushState;  const originalReplaceState = history.replaceState;
  history.pushState = function(...args) {    originalPushState.apply(history, args);    logger.info('检测到 pushState 事件');    setTimeout(() => handlePageChange(), 100);  };
  // 监听 hashchange 事件  window.addEventListener('hashchange', () => {    logger.info('检测到 hashchange 事件');    handlePageChange();  });
  // DOM 变化检测  const observer = new MutationObserver((mutations) => {    if (fillState.isAutoFillStopped && !fillState.pageChangeDetected) {      let significantChanges = 0;
      mutations.forEach((mutation) => {        if (mutation.type === 'childList') {          // 检查大量节点变化          if (mutation.addedNodes.length > 5 || mutation.removedNodes.length > 5) {            significantChanges++;          }
          // 检查结构性变化          mutation.addedNodes.forEach((node) => {            if (node instanceof Element) {              if (node.matches('form, input, textarea') ||                  node.querySelector('form, input, textarea')) {                significantChanges += 2;              }
              if (node.matches('main, article, section, .content, #content, .main, #main')) {                significantChanges += 3;              }            }          });        }      });
      // 判断是否为页面内容更新      if (significantChanges >= 3) {        logger.info(`检测到DOM变化 (${significantChanges}个变化点)`);
        if (detectPageChange()) {          fillState.pageChangeDetected = true;          handlePageChange();        }      }    }  });
  setInterval(() => {    if (detectPageChange()) {      handlePageChange();    }  }, 2000);}两段填充
async function executeFirstFill() {  if (fillState.isFirstFillCompleted) {    return;  }
  await performFill('首次');  fillState.isFirstFillCompleted = true;  logger.info('首次填充已完成');}
async function executeSecondFill() {  if (fillState.isSecondFillCompleted) {    return;  }
  await performFill('第二次');  fillState.isSecondFillCompleted = true;  fillState.isAutoFillStopped = true;  logger.info('第二次填充已完成,自动填充已停止');}立即体验
EasyFill v1.3 已正式发布:
- 新用户:Chrome Web Store 搜索 “EasyFill” 安装
- 现有用户:魔法联网后 Chrome 扩展将自动更新到最新版本
- 开发者:访问 github.com/achuanya/EasyFill 查看源代码
- 大陆访问:点此下载 Easyfill-1.3.0-chrome.zip
安装方式也很简单:下载后解压到文件夹,进入 Chrome → 管理扩展程序 → 加载未打包的扩展,选择解压目录即可。其他基于 Chromium 内核的浏览器同样适用。
EasyFill - 简易填充,让每一次评论更自然,与你的博友互动无缝连接