Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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
Javascript 简单的Chrome扩展不';不总是工作…只有在不调试时?_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript 简单的Chrome扩展不';不总是工作…只有在不调试时?

Javascript 简单的Chrome扩展不';不总是工作…只有在不调试时?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我有一个非常简单的Chrome扩展,它有一个带有单个按钮的弹出窗口。单击按钮时,它将创建一个新选项卡,然后在选项卡中更改徽章文本。创建回调函数。当我调试它(打开inspector窗口)时,它每次都工作。然而,当我正常使用它时(没有检查员),它只在某些时候起作用,通常不是第一次或第二次。具体来说,不总是有效的部分是徽章文本部分。始终会创建一个新选项卡,但徽章文本很麻烦 这和时间有关吗?这些异步函数已经让我的头脑混乱了很多次。不用说,我希望它每次都能工作,而不仅仅是有时 下面是我的代码的一个非常简单

我有一个非常简单的Chrome扩展,它有一个带有单个按钮的弹出窗口。单击按钮时,它将创建一个新选项卡,然后在
选项卡中更改徽章文本。创建
回调函数。当我调试它(打开inspector窗口)时,它每次都工作。然而,当我正常使用它时(没有检查员),它只在某些时候起作用,通常不是第一次或第二次。具体来说,不总是有效的部分是徽章文本部分。始终会创建一个新选项卡,但徽章文本很麻烦

这和时间有关吗?这些异步函数已经让我的头脑混乱了很多次。不用说,我希望它每次都能工作,而不仅仅是有时

下面是我的代码的一个非常简单的版本,以说明我遇到的基本问题:

manifest.json

{
  "name": "Test",
  "version": "1.0",
  "manifest_version": 2,
  "browser_action": {
    "default_icon": {
      "19": "images/icon19.png"
    },
    "default_popup": "popup.html"
  },
  "permissions": [
    "tabs"
  ],
  "background": {
    "scripts": ["background.js"]
  }
}
popup.html


这可能是一个类似于弹出窗口在所有代码执行之前卸载的问题。我个人还没有更新,但我可以想象这是可能的。解决此问题的一种方法是,在执行回调之前,不要让弹出窗口卸载。关键是
选项卡的
活动属性。创建
。例如:

function start(){
  // Make new tab
  chrome.tabs.create({ url:"http://google.com", active:false }, function(tab){

    // Get random number to display in badge to test if it's working
    var randomString = String(Math.floor(Math.random()*1000));

    // Display badge
    chrome.browserAction.setBadgeText({ text: randomString});

    chrome.tabs.update(tab.id,{active:true});
  });
}  

这样做可以消除竞争条件,并确保弹出窗口在设置徽章之前保持焦点。

对我来说效果很好。我的一个问题是,为什么在弹出页面中运行与后台脚本相同的脚本。即使它导致抛出错误,它仍然可以工作,但是它在后台页面中没有任何作用。关于后台页面,你是对的。我把它从舱单上拿了出来,它还在运行。但即使这样,它仍然不适合我所有的时间。有时它只是不添加徽章文本。我会调试它,但它总是在调试时工作(因为弹出窗口保持打开状态,也许吧?)。完美!它工作得很好。我甚至还没有探索活动的财产。谢谢你的快速帮助。我花了一些时间弄清楚为什么我的标签在启动时会被随机激活。该键是
激活的:true
此答案的一部分。真正的答案是,如果页面未处于活动状态,则无法在页面上设置徽章。您应该侦听已激活的
事件。
document.addEventListener('DOMContentLoaded', function () {
    var startButton = document.getElementById('start');
    startButton.addEventListener('click', function () {
        start();
    });
});


function start()
{
    // Make new tab
    chrome.tabs.create({ url: "http://google.com" }, function(tab){

        // Get random number to display in badge to test if it's working
        var randomString = String(Math.floor(Math.random()*1000));

        // Display badge
        chrome.browserAction.setBadgeText({ text: randomString});

    });
}
function start(){
  // Make new tab
  chrome.tabs.create({ url:"http://google.com", active:false }, function(tab){

    // Get random number to display in badge to test if it's working
    var randomString = String(Math.floor(Math.random()*1000));

    // Display badge
    chrome.browserAction.setBadgeText({ text: randomString});

    chrome.tabs.update(tab.id,{active:true});
  });
}