Chrome扩展和加载外部Google API未捕获引用错误

Chrome扩展和加载外部Google API未捕获引用错误,api,google-chrome,google-chrome-extension,google-calendar-api,Api,Google Chrome,Google Chrome Extension,Google Calendar Api,现在我正在创建一个Chrome扩展。为此,我需要使用谷歌的日历数据API。这是我的manifest.json文件: { "name": "Test", "version": "1.0", "background_page": "background.html", "content_scripts": [ { "matches": ["<all_urls>"], "js": ["jquery.js", "content_script.js"] } ],

现在我正在创建一个Chrome扩展。为此,我需要使用谷歌的日历数据API。这是我的manifest.json文件:

{
"name": "Test",
"version": "1.0",
"background_page": "background.html",
"content_scripts": [
    {
    "matches": ["<all_urls>"],
    "js": ["jquery.js", "content_script.js"]
    }
],
"permissions": [
    "tabs", "http://*/*"
]
我还尝试添加

document.write('<script type="text/javascript" src="http://www.google.com/jsapi?key=keyhere"></script>');

我得到一个错误,上面写着uncaughtreferenceerror:google没有定义。为什么我的扩展在加载其他api时没有加载此api?

您不能将外部脚本包含到
内容\u脚本中

如果要使用
文档插入
标记。写入
则需要在结束标记中屏蔽斜杠:

document.write('...<\/script>');
document.write(“…”);
您可以像往常一样将外部api js包含到后台页面中:

<script type="text/javascript" src="http://www.google.com/jsapi?key=keyhere"></script>


如果您在内容脚本中需要此api,那么您可以向您的后台页面发送请求,要求它在那里执行与api相关的操作,然后将结果发送回内容脚本。

您不能将外部脚本包含到
内容脚本中。

如果要使用
文档插入
标记。写入
则需要在结束标记中屏蔽斜杠:

document.write('...<\/script>');
document.write(“…”);
您可以像往常一样将外部api js包含到后台页面中:

<script type="text/javascript" src="http://www.google.com/jsapi?key=keyhere"></script>


如果你在内容脚本中需要这个api,那么你可以向你的后台页面发送一个请求,让它在那里做与api相关的事情,然后将结果发送回你的内容脚本。

谢谢你的链接,它帮了你很多忙。然而,现在我遇到了另一个有趣的问题

    for (var i = rangeArray.length - 1; i >= 0; i--) {
    var myLink = document.createElement('a'); 
    myLink.setAttribute('onclick','helloThere();'); 
    myLink.innerText ="GO";
    rangeArray[i].insertNode(myLink);
}
现在我得到了一个错误,“helloThere未定义”,即使我将该函数放置在同一文件中具有上述循环的当前函数上方大约十行。为什么会发生这种情况?如果我这样做了:

    for (var i = rangeArray.length - 1; i >= 0; i--) {
    var myLink = document.createElement('a'); 
    myLink.setAttribute('onclick','chrome.extension.sendRequest({greeting: "hello"}, function(response) { });'); 
    myLink.innerText ="GO";
    rangeArray[i].insertNode(myLink);
}

我得到了未捕获的TypeError:无法调用未定义的方法“sendRequest”

谢谢你的链接,它帮助了很多。然而,现在我遇到了另一个有趣的问题

    for (var i = rangeArray.length - 1; i >= 0; i--) {
    var myLink = document.createElement('a'); 
    myLink.setAttribute('onclick','helloThere();'); 
    myLink.innerText ="GO";
    rangeArray[i].insertNode(myLink);
}
现在我得到了一个错误,“helloThere未定义”,即使我将该函数放置在同一文件中具有上述循环的当前函数上方大约十行。为什么会发生这种情况?如果我这样做了:

    for (var i = rangeArray.length - 1; i >= 0; i--) {
    var myLink = document.createElement('a'); 
    myLink.setAttribute('onclick','chrome.extension.sendRequest({greeting: "hello"}, function(response) { });'); 
    myLink.innerText ="GO";
    rangeArray[i].insertNode(myLink);
}

我得到未捕获的TypeError:无法调用未定义的方法“sendRequest”

这是因为代码中存在一些语法错误。我也有同样的问题。我在fire fox中打开了background.html页面,启用了fire bug插件。Fire bug console应该会告诉我错误,我已修复,现在它正在工作。

这是因为您的代码中存在一些语法错误。我也有同样的问题。我在fire fox中打开了background.html页面,启用了fire bug插件。Fire bug console应该会告诉我错误,我已修复,现在可以正常工作。

我尝试在后台页面中正常添加它,但也不起作用。我需要在content_脚本中使用它,但我认为在background.html中加载它会自动允许我在content_脚本中使用它。@joshholat background页面几乎只是一个普通页面,没有任何限制。如果它在那里不起作用,那么问题就出在代码中。将您的后台页面放入webserver根目录并在浏览器中打开-我打赌它在那里也不会工作。此外,将api js放入后台页面不会自动将其加载到内容脚本中,它们是完全隔离的。为了在他们之间进行通信,你需要来回发送请求。我的意思是,我以正常方式将脚本添加到background.html中,但这样做之后,它仍然无法在content_脚本中识别Google。它将识别google.load(“gdata”,“1”);在background.html中,但在看到您添加的内容后,我需要在content\u脚本中使用它,我想我上面的评论可以解释为什么它现在不起作用。@joshholat如果您确实需要在content scripts中使用它,那么请尝试
document.write
技巧。我尝试在后台页面中正常添加它,但这也不起作用。我需要在content_脚本中使用它,但我认为在background.html中加载它会自动允许我在content_脚本中使用它。@joshholat background页面几乎只是一个普通页面,没有任何限制。如果它在那里不起作用,那么问题就出在代码中。将您的后台页面放入webserver根目录并在浏览器中打开-我打赌它在那里也不会工作。此外,将api js放入后台页面不会自动将其加载到内容脚本中,它们是完全隔离的。为了在他们之间进行通信,你需要来回发送请求。我的意思是,我以正常方式将脚本添加到background.html中,但这样做之后,它仍然无法在content_脚本中识别Google。它将识别google.load(“gdata”,“1”);在background.html中,但在看到您添加的内容后,我需要在content_脚本中使用它,我想我上面的评论可以解释为什么它现在不起作用。@joshholat如果您确实需要在content脚本中使用它,那么请尝试
document.write
技巧。可能最好将它作为另一个问题,因为它与内容无关。内容脚本和实际页面不共享变量空间,它们只共享DOM。不使用字符串,使用函数引用。而不是
myLink.setAttribute('onclick','hellother();')
say
myLink.onclick=helloThere
可能最好把它作为另一个问题,因为它不相关。内容脚本和实际页面不共享变量空间,它们只共享DOM。不使用字符串,使用函数引用。而不是
myLink.setAttribute('onclick','hellother();')
say
myLink.onclick=hellother