【问题标题】:Conditionally load content script into a Safari extension like in FF/Chrome?有条件地将内容脚本加载到 FF/Chrome 中的 Safari 扩展程序中?
【发布时间】:2014-10-17 16:15:22
【问题描述】:

我正在为 Chrome、Firefox 和 Safari 编写一个相当复杂的浏览器扩展。

在 Chrome 和 Firefox 中,我可以根据 URL 匹配指定将哪些内容脚本注入哪些站点。

Safari 似乎不提供任何此类(细粒度)功能——它们只允许所有网站使用一个白名单/黑名单。

有没有办法做到这一点?如果没有,我如何有条件地加载 Javascript 文件? (请记住,我无法将它们添加到 DOM)。

我试过 yepnope,但它附加到 DOM。

注意:我不想在实际文件中添加逻辑,因为它们本质上是跨扩展复制的库代码。

【问题讨论】:

    标签: javascript browser safari safari-extension content-script


    【解决方案1】:

    safari.extension.addContentScriptsafari.extension.addContentScriptFromURL 允许您以编程方式注入脚本。您可以在全局页面、扩展弹出框或扩展栏中使用这些方法。对于这两种方法,参数是:

    • 要注入的脚本(分别作为字符串或 URL),
    • 一个 URL 模式白名单,以匹配注入脚本的页面,
    • 排除页面的黑名单,以及
    • 一个布尔值,用于指示是否将脚本作为结束脚本(或作为开始脚本)注入。

    有关详细信息,请参阅 Safari 扩展参考中的 this page

    请注意,白名单和黑名单都使用与 UNIX 通配符相似(但不相同)的 URL 模式格式,并且不如正则表达式强大。这种模式格式在this page的底部有描述。

    【讨论】:

    • 谢谢。我不敢相信我找不到那个。
    【解决方案2】:

    接受的答案是正确的,但重要的是要注意,您不能以编程方式将脚本注入当前打开的选项卡,如 Chrome 和 Firefox 可以。 SafariExtension Class Reference 声明:

    添加和删除样式表和脚本。 添加或删除内容样式表会立即应用于页面。添加或删除内容脚本仅适用于在该点之后打开或重新加载的页面。删除 Info.plist 文件中的样式表或脚本只会将其从当前浏览器会话中删除。

    由于这个限制,通常更容易简单地依赖Info.plist 中的Scripts 属性。

    【讨论】:

    • Info.plist 不是 OP 抱怨的“一个白名单/黑名单”吗?
    • 确实如此,@Teepeemm。我的意思是要明确addContentScriptaddContentScriptFromURL 具有无法影响打开的标签的严重限制。我(显然还有其他人)偶然发现了这个问题,认为它允许真正的动态加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2014-11-01
    • 2011-11-25
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多