将 jQuery 加载到 chrome 扩展中

Posted

技术标签:

【中文标题】将 jQuery 加载到 chrome 扩展中【英文标题】:Loading jQuery into chrome-extension 【发布时间】:2012-08-15 15:22:22 【问题描述】:

我正在尝试进入 Chrome 扩展的神奇世界。 现在我已经建立了我的清单,试图加载 jquery。


    "name": "Test Extension",
    "version": "0.1",
    "manifest_version": 2,
    "description": "First try",
    "options_page": "options.html",
    "content_scripts": [
        "matches": ["chrome-extension://*/*"],
        "js": ["jquery.js", "popup.js"],
        "run_at": "document_end"
    ],
    "browser_action": 
        "default_icon": "icon.png",
        "default_popup": "popup.html",
        "default_title": "Click me!"
    

实际上尝试重新加载扩展程序告诉我“匹配项”与有效架构不匹配。

但这还不是全部。为了克服它,我尝试将“匹配”值更改为*://*/* 并重新加载。 好吧,扩展似乎加载正确,但似乎 jquery 没有加载,因为我可以从 popup.js 得到的错误告诉我

Uncaught ReferenceError: $ is not defined

其实 HTML 只是:

<!doctype html>
<html>
<head>
    <title>Test Extension</title>
    <link rel="stylesheet" style="text/css" src="style.css">
</head>
<body>
    <div id="test"></div>
</body>
</html>
<script type="text/javascript" src="popup.js"></script>

popup.js 代码就是这样做的:

$("#test").html("Foo!");

【问题讨论】:

您的意思是$("#test").html("Foo!"); 而不是$.('#test') 是的。那是一个分散注意力的错误。我要编辑这个问题。真丢人。当然,错误现在是一个更具指示性的“$ 未定义” 【参考方案1】:
$.("#test").html("Foo!");

应该是

$("#test").html("Foo!");

您得到的错误与这部分代码不正确是一致的。

【讨论】:

OP 编辑​​了他的问题,因此不再适用。我建议编辑答案或删除它。 但是现在错误也发生了变化,所以答案是有效的。但是,我会追加它。【参考方案2】:

内容脚本将从不在扩展程序的上下文中运行。在浏览器操作弹出窗口中加载脚本的正确方法是将其包含在代码中。让您的清单文件为:


    "name": "Test Extension",
    "version": "0.1",
    "manifest_version": 2,
    "options_page": "options.html",
    "browser_action": 
        "default_icon": "icon.png",
        "default_popup": "popup.html",
        "default_title": "Click me!"
    

还有popup.html:

...
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="popup.js"></script>

【讨论】:

按照你的建议改变,给我以下错误:拒绝执行内联脚本,因为它违反了以下Content Security Policy directive: "script-src 'self' chrome-extension-resource:". @theCrius 您的真实代码包含内联脚本(&lt;script&gt;....&lt;/script&gt; 或事件侦听器,Content security policy 明确禁止这些 - 请参阅 ***.com/a/10417745/938089。要解决它,请将代码移动到外部文件。 更正我之前的评论:“事件侦听器”是指“内联事件侦听器”,例如。 &lt;body onload="..."&gt;&lt;button onclick="..."&gt;. @theCrius 你把popup.js 放在了头上。该脚本会立即执行,但 &lt;body&gt; 甚至还不存在。要解决该特定问题,请将您的代码包装在 domready 事件处理程序中:$(function() $('#text').html('Foo!');); - 请参阅api.jquery.com/ready @Dan 我写了那个声明。单击 browserAction 按钮后显示的弹出窗口是从“chrome-extension://[EXTENSIONID]/popup.html”加载的。内容脚本只能插入到与某个match pattern 匹配的页面上。 chrome-extension:-URLs 无法与此类模式匹配(对于内容脚本),因此内容脚本无法在扩展页面中运行,即 Chrome 扩展的上下文。内容脚本将始终在选项卡的渲染器进程中运行。

以上是关于将 jQuery 加载到 chrome 扩展中的主要内容,如果未能解决你的问题,请参考以下文章

将 Google API Javascript 客户端库加载到 Chrome 扩展程序中

将 jQuery 与 Google Chrome 应用程序而非 Chrome 扩展程序一起使用

javascript Chrome扩展程序将自定义javascript文件加载到标签的DOM中。

使用 jQuery 将内容从 HTTP 页面加载到 HTTPS 页面

使用 selenium 加载 chrome 扩展

命令行 chrome 扩展加载和测试