Firefox 扩展内容脚本不加载和追加 HTML

Firefox extension content script does not load and append HTML

下面的所有内容都在 Chrome 扩展中工作,但在移植到 Firefox 时静默失败:

  1. 加载 test.html 除非我从中删除 <style></style>
  2. #test_element 附加到正文

样式是否必须放入 Firefox 扩展的单独文件中?为什么 append() 失败?

test.js

$(document).ready(function() {
    $.get(chrome.extension.getURL('/html/test.html'), function(data) {
        // not called unless style element is removed from HTML
        // and never actually appended if it is removed
        $(document.body).append($.parseHTML(data));
    });
});

test.html

<style></style>
<div id="test_element">
    <p>my name is cow</p>
</div>

manifest.json

{
    "manifest_version": 2,
    "name": "Test",
    "version": "1.0",

    "icons": {
        "64": "icons/icon-64.png"
    },

    "permissions": [
        "tabs",
        "storage",
        "idle"
    ],

    "content_scripts": [
        {
            "matches": ["<all_urls>"],
            "js": ["lib/jquery.js", "src/test.js"]
        }
    ],

    "web_accessible_resources": [
        "html/test.html"
    ]
}

它不是静静地落在我身上,而是给了我:

  XML Parsing Error: junk after document element
  Location: https://www.google.gr/
  Line Number 2, Column 1

这是因为它不是有效的 XML 文档(应该只存在一个根元素)。

我的方法如下:

test.html: (使其有效)

  <div>
    <style></style>
    <div id="test_element">
        <p>my name is cow</p>
    </div>
  </div>

test.js:(使用XML序列化器)

  $(document).ready(function() {
      $.get(chrome.extension.getURL('/html/test.html'), function(data) {
          res = new XMLSerializer().serializeToString(data);
          $(document.body).append(res);
      });
  });

对于 #1:请参阅 Christos 的解决方案。对于 #2:$.get() returns Chrome 中的字符串,但 Firefox 中的 XMLDocument (在附加之前必须用 serializeToString() 序列化)。无论如何,我删除了 jQuery 以使内容脚本更轻(顺便说一下,不需要 $(document).ready() 因为默认情况下内容脚本在 DOM 准备好后注入):

var httpRequest = new XMLHttpRequest();
httpRequest.onload = function(data) {
    httpRequest.onload = null;

    var template = document.createElement('template');
    template.innerHTML = data.target.responseText;

    var element = template.content.firstChild;
    document.body.appendChild(element);
}

httpRequest.open('GET', chrome.extension.getURL('/html/test.html'));
httpRequest.send();