Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome extension chrome扩展-获取最后一个url而不是当前url_Google Chrome Extension - Fatal编程技术网

Google chrome extension chrome扩展-获取最后一个url而不是当前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": [ {

我正在获取上次访问的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": [
    {
      "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是异步的。这意味着,当调用时,它初始化请求,然后完成其执行,以便执行脚本的下一部分