【问题标题】:Executing Javascript Inside of Javascript?在 Javascript 内部执行 Javascript?
【发布时间】:2016-12-23 18:56:45
【问题描述】:

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

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

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

控制台输出状态:

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

这是“主要”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。在我的问题中,我包括了

  • 具体问题或错误
  • 足够的代码来复制问题
  • 期望的行为
  • 明确声明
  • 我能找到的所有错误消息

你想让我做什么?

【问题讨论】:

  • edit 成为主题的问题:包括一个完整 minimal reproducible example 重复问题。包括一个manifest.json,一些背景/内容/弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括:►期望的行为,►特定问题或错误►必要的最短代码重现它在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:“如何创建 minimal reproducible example”、What topics can I ask about here?How to Ask
  • 阅读我的编辑@Makyen
  • 感谢您提供更多信息。 manifest.json 有帮助。它提供重要信息。在 Chrome 扩展程序中几乎总是需要一个 manifest.json 来了解发生了什么。如果您指定“main”JavaScript 文件的名称,而不是仅仅说“main”,这将很有帮助。 minimal reproducible example 的一大特点是我们应该能够将问题中的代码(并且也许使用一些明确标识的常用库)复制到我们自己的环境中并复制问题。无需猜测就能做到这一点,这让帮助变得更加容易。
  • 需要minimal reproducible example 的原因是我们想提供帮助。如果我们不必重新创建复制问题所需的任何代码,那么提供帮助会要容易得多。这是您已经拥有的代码。因此,请帮助我们帮助您并提供一个完整的 minimal reproducible example 以重复此类问题的问题。如果没有minimal reproducible example,甚至开始帮助您所需的努力很多更高,这显着减少了愿意/能够帮助您的人数。即使我们付出了额外的努力,我们也必须猜测您可能遇到的问题的很大一部分。
  • 基于一个假设:您将名称 h.js 用于自称为 mark.js 的文件(基于您的 pastebin链接),其中定义了Mark 有助于使这更加混乱。如果我的理解是正确的,您所称的 h.js 确实是 mark.js 如果您使用文件名 mark 将有助于使事情更容易理解.js。使用 h.js 会让人怀疑 h.js 实际上是定义Mark 的东西。请清楚地确定您所包含的文件包含哪些内容。照原样,我必须在您删除的问题上查看 cmets 才能知道。

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


【解决方案1】:

&lt;script&gt; 元素插入页面上下文,而不是内容脚本上下文

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

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

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

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

【讨论】:

  • 嘿,所以我将此pastebin.com/raw/B1Cpaq0G 添加到我的完整脚本的顶部,它指出相同的标记未定义错误。我检查了网页的 ,脚本被包含在内,似乎它们是在所有内容加载后执行的。我通过从每个 javascript 文件中输入变量或函数来检查这一点,它在控制台中显示得很好
  • @TheGuyWhoCodes,您似乎错过了将&lt;script&gt; 标签插入文档不会导致这些脚本被添加到您的内容脚本所在的上下文中的观点在跑。 &lt;script&gt; 插入到文档中的标签将在页面上下文中加载脚本,而不是在内容脚本上下文中。
猜你喜欢
  • 2018-04-19
  • 2010-10-15
  • 1970-01-01
  • 2017-04-05
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多