在Google Chrome扩展中获取cookies

21

我正在尝试使用以下代码从特定域名获取 cookie:

<script language="javascript" type="text/javascript">

var ID;

function getCookies(domain, name) {
    chrome.cookies.get({"url": domain, "name": name}, function(cookie) {
        ID = cookie.value;
    });
}

getCookies("http://www.example.com", "id")
alert(ID);

</script>

问题是弹出警告框始终显示为undefined。但是,如果我更改

ID = cookie.value;
alert(cookie.value);

它正常工作。我如何将这个值保存以便稍后使用?

更新:看起来如果我在脚本运行后从Chrome控制台调用alert(ID),它就可以工作。如何设置我的代码等待chrome.cookies.get运行完成?

3个回答

40

几乎所有的Chrome API调用都是异步的,因此您需要使用回调函数按顺序运行代码:

function getCookies(domain, name, callback) {
    chrome.cookies.get({"url": domain, "name": name}, function(cookie) {
        if(callback) {
            callback(cookie.value);
        }
    });
}

//usage:
getCookies("http://www.example.com", "id", function(id) {
    alert(id);
});

1
我该如何修改它以将其保存为变量?当我尝试使用ID = id而不是alert(id)时,仍然得到未定义。 - Franz Payer
2
@DazSlayer 所有依赖异步调用的代码都应该使用回调函数进行重写。因此,如果您需要在其他地方使用此ID,则还需要将该代码放在回调函数中。这里的代码不是逐行执行的。如果您使用过ajax,那么情况也是一样的,只需想象一下您正在向Chrome API发送ajax请求即可。 - serg
请注意,在manifest.json文件中添加"manifest_version": 2。 - Alex
我应该在哪里调用getCookie函数(以及在哪里放置代码)?是在我的background.js还是content.js中?或者我可以将其放在另一个脚本中吗?我有一个app.html文件,它像“chrome-extension://efmbliijihpahlhiamhmmfkbjkecofec/app.html”这样打开。 - Dean Van Greunen

5
任何依赖于调用chrome.cookies.get()结果的代码都必须从回调函数中调用。在你的例子中,只需等待回调触发后再显示警报:
<script language="JavaScript" type="text/javascript">

    var ID;

    function getCookies(domain, name) 
    {
        chrome.cookies.get({"url": domain, "name": name}, function(cookie) {
            ID = cookie.value;
            showId();
        });
    }

    function showId() {
        alert(ID);
    }

    getCookies("http://www.example.com", "id")        

</script>

我应该在哪里调用getCookie函数(以及在哪里放置该代码)?是在我的background.js还是content.js中?或者我可以将其放在另一个脚本中吗?我有一个app.html文件,它会像“chrome-extension://efmbliijihpahlhiamhmmfkbjkecofec/app.html”这样打开。 - Dean Van Greunen

1
获取特定域名下的所有 Cookie:
 const r = await chrome.cookies.getAll({ domain: domain }) //domain: stackoverflow.com

这个脚本可以从弹出窗口和后台服务工作者运行,但不能从内容脚本运行。


这只适用于manifest v3版本。 - cabiste

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