0

我的扩展旨在使用本地 JavaScript 库(如 PrimeUI、jQueryUI 及其对应的 CSS 样式表)注入一些 HTML 元素。

发现这样做的最好方法是按如下方式注入 HTML:

// test.js
$.get(chrome.extension.getURL('/overlay.html'), function(data) {
    $($.parseHTML(data)).appendTo('body');
}
// manifest.json
{
"name": "Test",
"version": "1.0",
"manifest_version": 2,
"options_page": "",
"description": "Test",
"browser_action": {
  "default_title": "Test",
  "default_popup": ""
},
"content_scripts": [
{
  "matches": [
    "<all_urls>"
  ],
  "js": [
    "js/jquery-3.1.1.min.js",
    "js/test.js"
  ]
}
],
"permissions": [
  "tabs"
],
"web_accessible_resources": [
  "overlay.html",

  "css/font-awesome.min.css",
  "css/jquery-ui.min.css",
  "css/primeui-all.min.css",

  "js/jquery-3.1.1.min.js",
  "js/jquery-ui.min.js",
  "js/primeelements.min.js",
  "js/primeui-all.min.js",
  "js/main.js"
]
}

我在根目录的“js”文件夹中有所需的 JavaScript 库,出于安全原因,我不会从 CDN 中检索它们。

我的 HTML<head>部分包含 CSS 和 JS,但样式和脚本以任何方式适用。

<html>
<head>
    <link rel="stylesheet" href="css/font-awesome.min.css"/>
    <link rel="stylesheet" href="css/jquery-ui.min.css"/>
    <link rel="stylesheet" href="css/primeui-all.min.css"/>

    <script type="text/javascript" src="js/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="js/jquery-ui.min.js"></script>
    <script type="text/javascript" src="js/primeui-all.min.js"></script>
    <script type="text/javascript" src="js/x-tag-core.min.js"></script>
    <script type="text/javascript" src="js/primeelements.min.js"></script>
</head>
<body>
    <button id="btn-show" type="button">Show</button>
    <div id="dlg" title="Godfather I">
        <p>The story begins as Don Vito Corleone, ...</p>
    </div>

</body>
</html>
// main.js
$(function() {
$('#dlg').puidialog({
    showEffect: 'fade',
    hideEffect: 'fade',
    minimizable: true,
    maximizable: true,
    responsive: true,
    minWidth: 200,
    modal: true,
    buttons: [{
        text: 'Yes',
        icon: 'fa-check',
        click: function() {
            $('#dlg').puidialog('hide');
        }
    },
        {
            text: 'No',
            icon: 'fa-close',
            click: function() {
                $('#dlg').puidialog('hide');
            }
        }
    ]
});
$('#btn-show').puibutton({
    icon: 'fa-external-link-square',
    click: function() {
        $('#dlg').puidialog('show');
    }
});
}

该按钮已成功显示,但没有附加任何事件或样式。

即:如果我在 StackOverflow 上注入此代码,我的按钮会从 SO 而不是我的样式中获取样式。

我想尽可能避免使用 JavaScript 来创建元素或以编程方式注入标签,以将视图与控制器分开。

我怎样才能像往常一样设法将我的样式和脚本与我注入的 HTML 一起使用?我尝试将它们添加到web_accessible_resources, 和其他清单字段,但未成功。

4

1 回答 1

0

Makyen解释说:

无法解析带有<head>硬编码元素的 HTML<script><link>. 相反,它应该以其他方式注入。

我选择注入文件的方式是:

对于 CSS

// Test.js

/** CSS Injection */
var link = document.createElement("link");
link.href = chrome.extension.getURL("css/jquery-ui.min.css");
link.type = "text/css";
link.rel = "stylesheet";
document.getElementsByTagName("head")[0].appendChild(link);

对于 JS

// Test.js

/** JavaScript Injection */
var s = document.createElement('script');
s.src = chrome.extension.getURL('js/jquery-3.1.1.min.js');
// "When an inline script is inserted in the document, it's immediately executed 
// and the <script> tag can safely be removed". – Rob W.
s.onload = s.remove;
(document.head || document.documentElement).appendChild(s);

尝试使用标签将大量代码/库插入到页面上下文中很可能会干扰页面的当前内容/JavaScript。您是否有理由将脚本插入页面上下文?通常,您会将这些插入的脚本(和 CSS)作为内容脚本(manifest.json content_scripts 或 chrome.tabs.executeScript()/chrome.tabs.insertCSS()。不在页面上下文中。 – Makyen

使用上面的代码,我已经成功地注入了文件,但是样式和功能只是有时会被应用,我会在修复这个问题时进行编辑。

于 2016-12-10T12:18:39.957 回答