javascript - 是否可以确保内容脚本注入(inject)的代码首先运行

标签 javascript google-chrome-extension

我正在开发一个用于 XHR 拦截的 Chrome 扩展。

为了到达响应正文,我注入(inject)了一些代码来拦截 XmlHttpRequest 类。

但是由于注入(inject)的脚本以不可预测的顺序(通常是最后一个)运行,它一直丢失第一批请求。

所以我想知道是否有一种方法可以确保动态注入(inject)的脚本早于网页的原始脚本运行。

以下是我的内容脚本的拦截模块。

内容脚本设置为在“document_start”运行

const doIntercept = () => {
  const xhrOverrideScript = document.createElement('script');
  xhrOverrideScript.type = 'text/javascript';
  xhrOverrideScript.innerHTML = INTERCEPT_SCRIPT_SHALL_BE_REPLACED_BY_WEBPACK;
  document.body.prepend(xhrOverrideScript);
}

const tryIntercept = () => {
  if (document.body && document.head) {
    doIntercept();
  } else {
    requestIdleCallback(tryIntercept);
  }
};

const interceptXHR = (onFinish) => {
  requestIdleCallback(tryIntercept);
  onFinish();
}

export default interceptXHR;

最佳答案

删除 requestIdleCallback 并直接将脚本附加到 document.documentElement,而无需等待 head 或 body 出现。

这是整个代码:

const interceptXHR = () => {
  const el = document.createElement('script');
  el.textContent = INTERCEPT_SCRIPT_SHALL_BE_REPLACED_BY_WEBPACK;
  document.documentElement.appendChild(el);
  el.remove();
};

它将同步运行,因此也不需要回调。
more methods但其中一些是异步的。

有一个相对流行的错误想法,即必须将脚本元素附加到头部或主体,而不是根元素,但它们只是混淆 HTML specs (参见“内容模型”)与 DOM specs不施加这样的限制。

关于javascript - 是否可以确保内容脚本注入(inject)的代码首先运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57644147/

相关文章:

javascript - Chrome 扩展 - javascript 中的功能无法正常工作

google-chrome-extension - 为什么我的 Chrome 扩展程序的扩展程序管理图标不显示?

javascript - 向 Chrome 扩展程序添加新范围

javascript - 在 document.write javascript 中联合两个变量

javascript - setAbstractView() 防止 mousedown 事件传播到 KmlFeatures

google-chrome - 谷歌浏览器扩展 : local storage

javascript - 重构DOM搜索方法?

javascript - jquery "this"在集合上下文中

Javascript查找并替换子字符串中的字符串不使用jquery

javascript - ASP.NET session 无法自行更新