将jQuery加载到Chrome扩展程序中

16

我正在尝试进入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!"
    }
}

尝试重新加载扩展会告诉我"匹配项"不符合有效的架构。

但这还不是全部。为了克服它,我尝试将"匹配项"的值更改为*:/ / * / *并重新加载。 嗯,扩展似乎成功加载了,但由于从弹出窗口.js中获取的错误,似乎jquery未加载:

Uncaught ReferenceError: $未定义

实际上,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!");

1
你是不是想用 $("#test").html("Foo!"); 而不是 $.('#test') - CD..
是的,那是一个分心错误。我将编辑问题。 真丢脸。当然,现在的错误更具指示性,是“$未定义”。 - Claudio
2个回答

17

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

{
    "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>

2
按照您的建议更改后,出现以下错误: 拒绝执行内联脚本,因为它违反了以下“内容安全策略指令:script-src 'self' chrome-extension-resource:”。 - Claudio
@theCrius,您是否已重新加载扩展名?您能否展示您的完整代码(无论是在问题中还是在http:// pastie.org/或http://pastebin.com/上)? - Rob W
2
@theCrius,你在HEAD中包含了popup.js。该脚本会立即执行,但是<body>甚至还不存在。为解决这个特定的问题,请将你的代码包装在domready事件处理程序中:$(function(){ $('#text').html('Foo!');}); - 参见http://api.jquery.com/ready/。 - Rob W
@RobW,你写道“内容脚本永远不会在扩展的上下文中运行” - 这是什么意思?谢谢。 - Dan
1
@Dan 我写了那个语句。在单击 browserAction 按钮后显示的弹出窗口是从 "chrome-extension://[EXTENSIONID]/popup.html" 加载的。内容脚本只能插入与某些 匹配模式 相匹配的页面上。chrome-extension: URL 不能被这些模式(对于内容脚本)匹配,因此内容脚本无法在扩展程序页面中运行,即 Chrome 扩展程序的上下文中。内容脚本将始终在选项卡的渲染器进程中运行。 - Rob W
显示剩余6条评论

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

应该是

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

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

5
楼主编辑了他的问题,因此这个回答不再适用。我建议修改答案或将其删除。 - Rob W
但现在错误也已经改变,所以答案是有效的。不过,我会追加它。 - Flater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接