Google chrome extension chrome扩展-获取最后一个url而不是当前url
我正在获取上次访问的url,而不是当前的url。(当我转到site.com,然后再转到site2.com,我得到的url是'site.com',刷新site2.com后,我得到了正确的url 根据这里的答案:Google chrome extension chrome扩展-获取最后一个url而不是当前url,google-chrome-extension,Google Chrome Extension,我正在获取上次访问的url,而不是当前的url。(当我转到site.com,然后再转到site2.com,我得到的url是'site.com',刷新site2.com后,我得到了正确的url 根据这里的答案: 我想出了以下代码: manifest.json { "manifest_version": 2, "browser_action": { "default_popup": "action.html" }, "content_scripts": [ {
我想出了以下代码: manifest.json
{
"manifest_version": 2,
"browser_action": {
"default_popup": "action.html"
},
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["content.js"],
"run_at": "document_end"
}
],
"background": {
"scripts": ["background.js"]
},
"permissions": [
"tabs",
"unlimitedStorage",
]
}
content.js
chrome.extension.sendRequest({method: "getUrl"}, function(response) {
console.log(response.data);
});
background.js
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if(request.method == "getUrl") {
chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) {
currentUrl = tabs[0].url;
});
sendResponse({data: currentUrl});
}
else
sendResponse({}); // snub them.
});
我也试着把这段代码直接放在content.js下面,我得到了一个错误,在background.js中,url被设置为chrome://extensions/
chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) {
currentUrl = tabs[0].url;
});
正确的方法是什么?首先:
chrome.extension.sendRequest/onRequest已被弃用。请改用/。此外,尽可能地选择而不是背景页面。大多数情况下,将背景页面转换为事件页面几乎不需要任何时间,但可以节省大量资源 问题:
chrome.tabs.query是异步的。这意味着,调用时,它初始化请求,然后完成执行,以便执行脚本的下一部分。请求完成后,将执行注册的回调函数。因此,在您的情况下会发生以下情况:
http://www.site1.com
chrome.tabs.query({…},回调)
被执行(注意回调还没有执行)sendResponse({data:currentUrl})
被执行(注意,此时未定义currentUrl
)chrome.tabs.query
的请求完成并执行回调函数,设置currentUrl=”http://www.site1.com“
(但只有在为时已晚之后)http://www.site2.com
chrome.tabs.query({…},回调)
被执行(注意回调还没有执行)sendResponse({data:currentUrl})
被执行(注意,此时currentUrl
仍然等于http://www.site1.com
来自步骤4)chrome.tabs.query
的请求完成并执行回调函数,设置currentUrl=”http://www.site2.com“
(太晚后再重复)(A)
将逻辑移到回调中。
(注意:每当异步调用回调(即
sendResponse
)时,onMessage
侦听器必须返回true
)
(B)在您的情况下,更简单的是,侦听器的
发送者
参数包含包含URL信息的字段选项卡
。例如:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.method && (request.method == "getURL") && sendResponse) {
sendResponse({ data: sender.tab.url });
}
});
(C)如果您只需要内容脚本上下文中的URL,为什么不在内容脚本中使用
location.href
chrome.extension.sendRequest/onRequest已被弃用。请改用/。此外,尽可能地选择而不是背景页面。大多数情况下,将背景页面转换为事件页面几乎不需要任何时间,但可以节省大量资源 问题:
chrome.tabs.query是异步的。这意味着,调用时,它初始化请求,然后完成执行,以便执行脚本的下一部分。请求完成后,将执行注册的回调函数。因此,在您的情况下会发生以下情况:
http://www.site1.com
chrome.tabs.query({…},回调)
被执行(注意回调还没有执行)sendResponse({data:currentUrl})
被执行(注意,此时未定义currentUrl
)chrome.tabs.query
的请求完成并执行回调函数,设置currentUrl=”http://www.site1.com“
(但只有在为时已晚之后)http://www.site2.com
chrome.tabs.query({…},回调)
被执行(注意回调还没有执行)sendResponse({data:currentUrl})
被执行(注意,此时currentUrl
仍然等于http://www.site1.com
来自步骤4)chrome.tabs.query
的请求完成并执行回调函数,设置currentUrl=”http://www.site2.com“
(太晚后再重复)(A)
将逻辑移到回调中。
(注意:每当异步调用回调(即
sendResponse
)时,onMessage
侦听器必须返回true
)
(B)在您的情况下,更简单的是,侦听器的
发送者
参数包含包含URL信息的字段选项卡
。例如:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if(request.method && (request.method == "getURL") && sendResponse) {
sendResponse({ data: sender.tab.url });
}
});
(C)如果您只需要内容脚本上下文中的URL,为什么不在内容脚本中使用
location.href
chrome.extension.sendRequest/onRequest已被弃用。请改用/。此外,尽可能地选择而不是背景页面。大多数情况下,将背景页面转换为事件页面几乎不需要任何时间,但可以节省大量资源 问题:
chrome.tabs.query是异步的。这意味着,当调用时,它初始化请求,然后完成其执行,以便执行脚本的下一部分