3

我有一个非常简单的 Chrome 扩展程序,它有一个带有单个按钮的弹出窗口。tabs.create当您单击按钮时,它会创建一个新选项卡,然后在回调函数中更改标记文本。当我调试它(​​打开检查器窗口)时,它每次都有效。但是,当我正常使用它时(没有检查器),它只是有时有效,通常不是第一次或两次。具体来说,并不总是有效的部分是徽章文本部分。总是会创建一个新选项卡,但徽章文本很麻烦。

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

这是我的代码的一个非常简单的版本,用于说明我遇到的基本问题:

清单.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

<script src="background.js"></script>

<html>
<body>

<button id="start">Start</button>

</body>
</html>

背景.js

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});

    });
}
4

1 回答 1

3

这可能是与此问题类似的问题,弹出窗口将在所有代码执行之前卸载。我个人没有让它不更新,但我可以想象这是可能的。解决此问题的一种方法是在完成执行回调之前不让弹出窗口卸载。关键是 的active属性tabs.create。例子:

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});
  });
}  

这样做应该消除竞争条件并确保弹出窗口保持焦点,直到它设置徽章。

于 2013-05-25T21:49:01.743 回答