0

我正在将亚马逊链接本地化器转换为 Chrome 扩展程序。我目前正在处理的错误是:

未捕获的 ReferenceError:未定义 checkAmazonLinks

发布此 JSON 的 URL 是:https ://freegeoip.net/json/?callback=checkAmazonLinks 我在我的 JS 文件中这样称呼它:

function findLocation() {
if (typeof google != "undefined" && google.loader.ClientLocation != null) {
    var strCountry = google.loader.ClientLocation.address.country_code;
    checkAmazonLinks(strCountry)
    console.log(strCountry)
} else {
    objScript = document.createElement("script");
    objScript.src = "https://freegeoip.net/json/?callback=checkAmazonLinks";
    document.getElementsByTagName("head")[0].appendChild(objScript);
}

这是我的 manifest.js:

{
"name"              : "amazon linker",
"version"           : "0.1",
"manifest_version"  : 2,
"description"       : "A simple extension that turns all Amazon links on a page into localized affiliate links",
"permissions"     : [ "http://*/*","https://*/*"],
"browser_action": {
    "default_title": "Amazon Linker"
},
"content_security_policy": "script-src 'self' https://google.com; https://freegeoip.net;  object-src 'self'",

"content_scripts": [{
        "matches": ["<all_urls>"],
        "js": ["amazon-localiser.js"]
    }
],
 "web_accessible_resources": ["amazon-localiser.js","amazon-localiser.php"]
}

我曾尝试从 freegeoip 的 json 请求中删除回调,但随后我收到一条错误消息

Uncaught SyntaxError: Unexpected token :

我的 .js 中有一个调用 的函数checkAmazonLinks(),它是在 之后加载findLocation()的,我尝试重新排列顺序,但这没有帮助。想法是checkAmazonLinks()在 .js 中定义,然后findLocation()通过具有相同函数名称的回调检索 JSON。我如何克服这个错误?

4

1 回答 1

0

内容脚本在一个孤立的世界(沙盒环境)中运行。您在内容脚本的上下文中定义了checkAmazonLinks函数,但https://freegeoip.net/json/?callback=checkAmazonLinks在网页的 JS 上下文中注入和执行(因为内容脚本和网页共享 DOM)。
问题是在网页的上下文中,没有checkAmazonLinks定义函数。

解决方案:

A.)
checkAmazonLinkshttps://freegeoip.net/.... 例如:

...
} else {
    objScript1 = document.createElement("script");
    objScript1.innerHTML = "function checkAmazonLinks(...) {...}";
    document.getElementsByTagName("head")[0].appendChild(objScript1);

    objScript = document.createElement("script");
    objScript.src = "https://freegeoip.net/json/?callback=checkAmazonLinks";
    document.getElementsByTagName("head")[0].appendChild(objScript);
}

B.)
在内容脚本的上下文中提出(并处理)请求。例如,对函数进行 AJAX 调用https://freegeoip.net/json并将响应传递给checkAmazonLinks函数。

于 2013-11-03T18:07:45.800 回答