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

时间:2017-07-11 15:57:13

标签: google-chrome-extension firefox-addon firefox-webextensions

以下所有内容均适用于Chrome扩展程序,但在移植到Firefox时无声地失败:

  1. 加载test.html,除非我从中移除<style></style>
  2. #test_element附加到正文
  3. 样式是否必须进入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"
        ]
    }
    

2 个答案:

答案 0 :(得分:1)

它并没有默默地落在我身上,而是给了我:

  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 :(使用XMLSerializer)

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

答案 1 :(得分:0)

对于#1:请参阅Christos的解决方案。对于#2:$.get()在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();