为什么捐赠
API 浏览器
联系站长
Quasar CLI with Webpack - @quasar/app-webpack
内容脚本

内容脚本运行在网页的上下文中。每个运行该扩展的标签页都会产生一个新的内容脚本实例。

通信 / 事件

你可以通过我们的 BEX Bridge 在 BEX 的各个部分(后台脚本、内容脚本和开发者工具/弹出窗口/选项页)之间进行通信。

注册内容脚本

/src-bex/manifest.json 是定义你的 BEX 的核心文件。你也需要在这里定义你的内容脚本:

/src-bex/manifest.json

"content_scripts": [
  {
    "matches": [ "<all_urls>" ],
    "css": [ "assets/content.css" ],
    "js": [ "my-content-script.ts" ]
  }
]

面向 TS 开发者

你的后台脚本和内容脚本使用 .ts 扩展名。在 manifest.json 中也要使用该扩展名!例如:“background.ts”、“my-content-script.ts”。虽然浏览器厂商只支持 .js 扩展名,但 Quasar CLI 会自动转换文件扩展名。

案例分析

假设我们想在 Quasar 应用中响应按钮点击事件,并高亮底层网页上的某些文本,这可以通过内容脚本实现:

Quasar App, /src

setup () {
  const $q = useQuasar()

  async function myButtonClickHandler () {
    await $q.bex.send('highlight.content', { selector: '.some-class' })
    $q.notify('Text has been highlighted')
  }

  return { myButtonClickHandler }
}
/src-bex/assets/content.css

.bex-highlight {
  background-color: red;
}
/src-bex/my-content-script.js:

/**
 * 导入下面的文件会初始化内容脚本。
 *
 * 注意事项:
 *   不要移除下面的 import 语句。它是扩展正常工作所必需的。
 *   如果你不需要 createBridge(),保留 "import '#q-app/bex/content'" 即可。
 */
import { createBridge } from "#q-app/bex/content";

// bridge 的使用是可选的。
const bridge = createBridge({ debug: false });

bridge.on("highlight.content", ({ payload }) => {
  const el = document.querySelector(data.selector);
  if (el !== null) {
    el.classList.add("bex-highlight");
  }
});

bridge
  .connectToBackground()
  .then(() => {
    console.log("Connected to background");
  })
  .catch((err) => {
    console.error("Failed to connect to background:", err);
  });

内容脚本运行在一个隔离的环境中,这使得内容脚本可以修改其 JavaScript 环境,而不会与页面或其他内容脚本产生冲突。

隔离的环境不允许内容脚本、扩展和网页之间互相访问对方创建的变量或函数。这也赋予了内容脚本启用那些不应被网页访问的功能的能力。