2

在以下 google chrome 扩展文件中,为什么我不能在 myscript.js 文件中使用 jquery 脚本,jquery 是否未加载到 myscript.js 文件中,应在清单文件中进行哪些更改以在 myscript.js 中使用 jquery

清单.json

  {
    "manifest_version": 2,

    "name": "One-click Kittens",
    "description": "This extension demonstrates a browser action with kittens.",
    "version": "1.0",
     "background": { "scripts": ["jquery-1.9.1.min.js","myscript.js"] },

    "permissions": [
     "tabs", "http://*/*"
    ],
    "browser_action": {
      "default_icon": "icon.png",
      "default_popup": "popup.html"
    }
  }

myscript.js

 alert($("#extension-command-list").val());    //undefined
 alert($("#extension-command-list").html());   //undefined
 $(document).ready(function() {
    alert("hello world");  //not seen
 });

编辑:

"background": { "scripts": ["jquery-1.9.1.min.js"] },

 "content_scripts": [
 {
  "matches": ["https://*/*"],
  "js": ["myscript.js"]   or "js": ["jquery-1.9.1.min.js","myscript.js"]
 }
],
4

1 回答 1

6

您得到的原因undefined是因为您没有指定背景页面。

所以.. Chrome 生成的背景页面,看起来就像

<html>

    <head></head>

    <body>
        <script src="jquery-1.9.1.min.js"></script>
        <script src="myscript.js"></script>
    </body>

</html>

如您所见,没有任何可以选择的元素,这就是为什么您的第一个也是alertreturn undefined

无论如何,alert("hello world")也应该显示,因为应该以任何方式解雇DOMContentLoaded 或类似的。


您是否想选择您正在访问的网站的元素?

如果是这样,您应该放入myscript.js内容脚本而不是背景页面。在那里,您可以访问站点的 DOM。


所以问题是,你在做什么?


如果你真的想在你的背景页面中选择元素,你必须指定一个,看看背景页面网站会告诉你,它很简单:

{
"name": "我的扩展",
...
"background": {
"page": "background.html"
},
...
}

编辑:

  • “default_popup”:“popup.html”

指的是浏览器操作弹出窗口。使用了浏览器操作

[...] 将图标放在地址栏右侧的 Google Chrome 主工具栏中。除了图标之外,浏览器操作还可以有工具提示、徽章和弹出窗口。

所以

如果浏览器操作有弹出窗口,则当用户单击图标时会出现弹出窗口。弹出窗口可以包含您喜欢的任何 HTML 内容,并且会自动调整大小以适合其内容。要将弹出窗口添加到您的浏览器操作,请使用弹出窗口的内容创建一个 HTML 文件。在 manifest 中 browser_action 的 default_popup 字段中指定 HTML 文件,或者调用 setPopup 方法。

  • “背景”:”{...}”

扩展的一个常见需求是拥有一个长时间运行的脚本来管理某些任务或状态。背景页面进行救援。
正如架构概述所解释的,后台页面是在扩展进程中运行的 HTML 页面。它在您的扩展程序的整个生命周期内都存在,并且一次只有一个实例处于活动状态。

还可以通过后台脚本访问 Chrome 扩展 Api 的所有部分。 chrome.* 如果您已分别请求权限


现在让我们说,例如,您想用一些功能扩展 chrome 的 ContextMenu。

为此,您首先要在后台页面中创建一个 contextMenuEntry。
就像您的背景页面一次只有一个实例运行,并且在扩展的生命周期内,您的 contextMenuEntry 也应该只有一个实例,它在您的扩展运行时创建并在生命周期内保持你的分机。

现在假设您要在其中一个菜单条目中显示您正在访问的页面的当前选定文本。

为此,您需要访问chrome.contextMenusAPI 方法,但不允许 contentscript使用它。

要使其正常工作,您需要通过例如将带有所选文本的消息传递到背景页面chrome.extension.sendMessage

然后,您可以在后台页面中更新现有的上下文菜单条目以显示选定的文本。

对不起,我现在想不出更好的例子

于 2013-03-21T11:52:20.137 回答