javascript - 在 Firefox Webextension Contentscript 中使用 fontawesome

标签 javascript html google-chrome-extension font-awesome firefox-addon-webextensions

我想用 Fontawesome 图标来设计我的 Webextension。对于弹出菜单和扩展设置,这没有问题,但我的内容脚本无法访问它。

为了创建一个最小的示例,我设置了一个存储库:

git clone https://github.com/lhk/fa_test.git
cd fa_test
npm install -d

它将 fontawesome javascript 作为内容脚本注入(inject)。 list .json:

"content_scripts": [
      {
        "matches": [
          "https://*.wikipedia.org/*"
        ],
        "js": [
          "node_modules/jquery/dist/jquery.min.js",
          "./node_modules/@fortawesome/fontawesome-free/js/all.js",
          "./content.js"
        ]
      }
    ],

然后在网站末尾添加一个图标(虽然只有维基百科): content.js:

$(function(){
    $('<div> <i class="fas fa-question-circle fa-2x"></i> </div>').appendTo('body')
})

在 Chrome 中这完美地工作,这是它的样子: enter image description here

在 Firefox 上,图标根本不存在(请注意,脚本仅注入(inject)维基百科,在那里进行测试)。

起初我以为这与 CSP 有关,也许 fontawesome 正在向被 Firefox 过滤的 CDN 发出一些请求。但是我在开发人员设置的网络 Pane 中找不到任何此类请求。 在任何 Web 控制台中也没有错误消息。

最佳答案

FontAwesome 正在观察 DOM 突变以替换 <i.../> 的标记与 svg元素。据我所知,替换应该发生在 requestAnimationFrame 内。回调和由于某种原因回调 requestAnimationFrame没有被调用。
经过研究和调试后,我得出了一个非常奇怪的结论,但我确信我找到了原因,甚至找到了一个不错的解决方法。

我怀疑有以下错误:
在 Webextension 内容脚本中,当全局 requestAnimationFrame函数被分配给一个变量而不受 window 的限制。它不工作。

Font Awesome 正是这样做的 here , 它阻止了 this callback免于被调用,这对于我上面提到的替换过程至关重要。

因此解决方法是将以下文件添加到您的内容脚本列表中,它应该可以工作:

/* raf-ff-fix.js */
window.requestAnimationFrame = window.requestAnimationFrame.bind(window)
/* manifest.json */

// ...
"js": [
      "./raf-ff-fix.js",
      // ....
]

关于javascript - 在 Firefox Webextension Contentscript 中使用 fontawesome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736468/

相关文章:

javascript - Chrome 扩展 : Waiting For Element to Load (async js)

javascript - websocket 握手后,chrome 断开连接。这是由于域不匹配吗?还是 Chrome 错误?

javascript - javascript 中是否有等效的 php echo/print

javascript - 从 json 数组中提取特定的键

html - 编辑 .htaccess 后背景图像消失

javascript - ReactJS:如何让<div/> float 不影响下一个<div/>?

javascript - 我如何使用js截屏并上传图片?

javascript - 为什么每次重新渲染父 View 时都需要重新委托(delegate) subview 的事件?

未收到 PHP 联系表单消息

javascript - chrome.tabs.update 无法始终如一地工作