【发布时间】:2015-04-02 16:14:56
【问题描述】:
总结:
基本上,我使用后台页面来监听事件,例如:onStartup、onInstalled 和 cookies.onChanged 来决定当点击 browserAction 时应该向用户显示哪个页面。我的问题是关于后者以及它是如何触发的。
代码示例:
chrome.cookies.onChanged.addListener(function(info){
if(info.cookie.name === "dummycookie"){
/* Possibilities of info.cause (as described in the docs):
* evicted
* expired
* explicit (it's used when setting or removing a cookie)
* expired_overwrite
* overwrite
*/
if(info.cause == "overwrite" || (info.cause == "explicit" && !info.removed)){
// Cookie was set (explicit or overwrite)
chrome.browserAction.setPopup({ popup: "dummy1.html" });
}
else{
// Cookie was removed (evicted, expired or expired_overwrite)
chrome.browserAction.setPopup({ popup: "dummy2.html" });
}
}
});
问题是,尽管上面的代码可以很好地处理显式调用(cookies.set 和 cookies.get),但它似乎不会在 cookie 生命周期到期时触发..
根据我进行的调试会话,只有在 cookie 的预期到期日期之后进行显式调用时才会触发代码。
例如如果我在假定的过期时间之后拨打 cookies.getAll() 之类的电话,浏览器会意识到 cookie 已过期,然后才会触发事件。
我错过了什么吗?如果我误用了 cookie API 或者我误解了它背后的机制,谁能告诉我?
非常感谢任何帮助!
最好的问候,
【问题讨论】:
-
我建议改变你的逻辑。与其被动监听 cookie 事件,不如在弹窗打开时主动查询 cookie 的状态。这不仅可以解决您的错误,而且还可以减少资源密集型。
-
@RobW 感谢您发表评论,我很感激,因为这个问题没有引起太多关注。无论如何,我不确定我是否正确理解了您的建议,但如果我查询请求弹出窗口后 cookie 的状态,然后才更改应显示的 HTML,我将创建一个糟糕的用户体验,因为他必须单击两次浏览器操作才能实际更新弹出窗口。 (第一个将设置弹出窗口的 html,第二个实际获取有效的 cookie 状态,然后让页面正确显示)。
-
为什么不呢?
chrome.cookies.get({url: 'http://example.com/', name: 'dummycookie'}, function(cookies) { /* now do whatever you want */ }); -
我在回复完之前不小心按了回车,你能再看一遍吗?我不确定我是否说得够清楚..
-
是什么让你认为用户必须点击两次?您可以使用单个 HTML 页面,并在弹出页面中使用
chrome.cookies.get来获取 cookie 并根据结果更新文档。
标签: javascript cookies google-chrome-extension