在Javascript里面执行Javascript?

时间:2016-12-23 18:56:46

标签: javascript jquery google-chrome google-chrome-extension

所以我正在制作一个Chrome扩展程序,它使用了我制作的一些TamperMonkey脚本。我想要一个“主”javascript文件,在其中包含并执行其他脚本。我很擅长使用以下行包含其他javascript文件:

var s1 = document.createElement('script');
s1.src = chrome.extension.getURL('h.js');
document.head.appendChild(s1);

使用这些行时我遇到的主要问题是它获取代码并将其添加到文档头,但从不执行。

Chrome Sources

控制台输出状态:

enter image description here

所以我猜我的主要问题是;如何让代码执行以便我可以从中运行各种方法和类?

这是“主要”javascript文件:

var s1 = document.createElement('script');
s1.src = chrome.extension.getURL('h.js');
document.head.appendChild(s1);

var posinstance = new Mark(document.querySelector("#postingbody"));
posinstance.mark(positive, {
accuracy: {
  value: "exactly",
  limiters: [".", ",", "!"]
},
separateWordSearch: false,
diacritics: false,
className: "positive"
});

这是我试图包含的脚本: http://pastebin.com/raw/ESL1xYZ7

编辑:这是manifest.json

  {  "manifest_version": 2,
    "content_scripts": [ {
        "exclude_globs":    [  ],
        "include_globs":    [ "*" ],
        "js":["jquery.user.js","globalVar.user.js","h.js", "word-highlighter.user.js"],
        "matches": ["http://*/*","https://*/*"],
        "run_at": "document_end",
        "permissions":["tabs","<all_urls>"]

    } ],
    "converted_from_user_script": true,
    "description":  "did i do it right?",
    "name":         "Car Stuffs",
    "version":      "1.00",
    "web_accessible_resources": ["jquery.user.js","h.js", "globalVar.user.js"]
}

此外,我已经阅读了你多次链接我的文件,Makyen。在我的问题中,我已经包含了

  • 特定问题或错误
  • 足以复制问题的代码
  • 期望的行为
  • 明确声明
  • 我能找到的所有错误消息

你想让我做什么?

1 个答案:

答案 0 :(得分:1)

<script>元素插入页面上下文,而不是内容脚本上下文

在内容脚本中,您似乎尝试在文档中插入<script>元素,然后使用内容脚本中<script>元素中的代码。那样不行。在内容脚本中,您插入到文档中的任何<script>元素都会导致在页面上下文中加载和执行包含/引用的脚本,而不是内容脚本上下文。您将无法直接使用任何函数/对象/类/等。它们包含在内容脚本中插入的<script>中。

如果您尝试在页面上下文中插入多个脚本,则需要考虑它们是异步加载的事实。您可以执行How to sequentially insert scripts into the page context using <script> tags的答案中描述的内容。但是,对于您似乎想要做的事情,这不是如何实现它。您似乎希望将脚本动态加载到内容脚本上下文中,而不是页面脚本上下文中。

将脚本动态加载到内容脚本上下文

如果要将其他脚本动态加载到上下文脚本上下文中,则需要send a message到后台脚本,指示后台脚本使用chrome.tabs.executeScript()注入其他脚本。这是一种理想的机制,用于将精心设计的UI所需的所有文件加载到每个页面中,这对于将用户界面强加给可能很少使用的扩展的用户界面来说是一个沉重的负担。如果你的UI要从网页开始,那么在每个页面中加载一小段代码要好得多。该代码可以监视用户开始与您的扩展程序的UI进行交互。当用户开始与您的UI交互时,少量代码可以向后台脚本发送消息,以注入完整UI所需的其余代码。