【问题标题】:Can chrome.browserAction.setBadgeText load string from a script?chrome.browserAction.setBadgeText 可以从脚本中加载字符串吗?
【发布时间】:2014-07-15 04:37:37
【问题描述】:

我知道使用以下内容会在我的 Google Chrome 扩展程序上加载带有背景的文本,并且会将其截断为前四个字母。

chrome.browserAction.setBadgeBackgroundColor({ color: [255, 0, 0, 255] });
chrome.browserAction.setBadgeText ( { text: "loading" } );

但我想要做的是允许部分如果它说loading 显示来自 js 脚本的字符串结果。我已经在网上和 StackOverflow 上查看了答案,但我还没有找到任何与我正在尝试做的事情相关的东西,所以我决定在这里问这个问题。

我的 manifest.json 有背景,js 加载:

"background": {
  "scripts":["background.js"]
}

background.js -然后在background.js 中,我一直在尝试通过从number.js 加载结果来使其工作,但我就是无法让它工作。曾经。我知道这里的代码是错误的,因为我把它搞砸了,但我会把它包括在内,这样你就可以了解我想要做什么:

var imported = document.createElement('script');
imported.src = 'number.js';
document.head.appendChild(imported);

chrome.browserAction.setBadgeBackgroundColor({ color: [255, 0, 0, 255] });
chrome.browserAction.setBadgeText ( { text: "loading" } );

chrome.tabs.executeScript(null,
{code:"globalVarName = {'scriptOptions': {...}};" },
chrome.tabs.executeScript(null, {file: "number.js"},

number.js - 然后我最终要加载的是来自number.js 的字符串:

var ip = "chromahills.net";

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://minecraft-api.com/v1/get/?server=" + ip, true);
xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
                data = JSON.parse(xhr.responseText);
                if (data.status) {
                        document.write(data.players.online);
                } else {
                        document.write("Fail");
                }
        }
}

xhr.send();

问题

所以,直截了当,我的问题如下:

  • 是否可以在.setBadgeText 中包含javascript 字符串?
  • 如果是这样,最有效的方法是什么?

我知道这是一段很长的文字,但我尝试包含尽可能多的细节,以便您了解我正在尝试做的事情,并希望能解释一种更好的方法来做我正在做的事情,即使它是实际上是可能的。

编辑

现在问题已解决,我已删除我的进度以避免混淆。如果您想查看我尝试过的内容,请单击此处 -> http://jsfiddle.net/lukexf/5d72Q/ 或阅读以下解决方案

【问题讨论】:

  • document.write 在 background.js 中肯定是错误的......但是如果您的最后一个代码段有效,那么我下面答案的代码段也将有效。当然,您必须确保我的代码段包含在一个函数中,并且您在正确的时间调用该函数
  • 当你说it fails to work ...你在调试控制台中得到了什么?
  • @devnull69 puu.sh/93fTu.png 这是我的代码。我已经在 J​​S 的其他地方进行了测试(不使用镀铬部件),它工作正常。 chrome.browserAction.setBadgeText ( { text: data.players.online } ); simple 没有出现在图标上。 chrome.browserAction.setBadgeText ( { text: "test" } ); 显然会返回测试和背景。即使文本无法加载,背景也会加载。调试控制台也没有错误。
  • 请将console.log(data.players.online) 添加到代码的if 部分,并准确告诉我们输出是什么
  • jsfiddle.net/lukexf/B78B9 我试着把它放进去,但我不确定它应该放在哪里,因为它没有记录任何东西。所以我把项目的一部分放在了 jsfiddle 上。如果你能指出它会去哪里,那真的会对我有帮助。非常感谢您到目前为止的帮助:)

标签: javascript jquery google-chrome google-chrome-extension google-chrome-devtools


【解决方案1】:

当然你可以在.setBadgeText 中显示一个 Javascript 字符串,事实上它是你唯一可以显示的内容:-)

所以,我试图理解你的问题的诀窍......我认为你想以某种方式 call number.js 然后检索输出(document.write 写入屏幕)。

但这是错误的做法。

为什么不直接在 background.js 中实现下面的代码(你可以很容易地访问 badText)?

var ip = "chromahills.net";

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://minecraft-api.com/v1/get/?server=" + ip, true);
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
            data = JSON.parse(xhr.responseText);
            if (data.status) {
                    chrome.browserAction.setBadgeText ( { text: data.players.online.toString() } );
            } else {
                    chrome.browserAction.setBadgeText( { text: "Fail" });
            }
    }
}

xhr.send();

【讨论】:

  • 我在帖子上方进行了编辑,这样您就可以看到我测试过的内容。我在下面包含了我从中获取数据的 API。您可以向下滚动以查看 API 如何适用于我之前使用的内容。 Link Here 这包括底部的 JavaScript 用法。
  • @devnull69 所以问题基本上归结为setBadgeText 不接受text 属性的数字。您可以编辑您的答案以使其正确吗? (例如'' + data.players.online
  • 我添加了一个toString,因为它比''+number更容易解释
【解决方案2】:

所以我终于解决了这个问题。这是通过允许该函数检查 IP 的状态,然后在正确的条件下显示它来完成的。不使用任何 xhr 都有帮助,因为它现在加载了一种更有效的方式。我还学习了如何根据字符串的状态包含图像。

我希望这能像对我一样帮助其他人。

var ip;
var timer;

function loadExtension () {
    if (!ip) {
        ip = 'chromahills.net';
    }

    checkState();
}

function checkState () {
    $.get('https://aron.li/mss/ping.php?ip=' + ip, function(data) {
        if (data.max != null) {
            chrome.browserAction.setBadgeBackgroundColor({ color: [122, 186, 122, 255] });
            chrome.browserAction.setIcon({path: 'up.png'});
            chrome.browserAction.setBadgeText({text: '' + data.online});
        } else {
            chrome.browserAction.setIcon({path: 'down.png'});
            chrome.browserAction.setBadgeText({text: 'OFF' });
            hrome.browserAction.setBadgeBackgroundColor({ color: [255, 0, 0, 255] });
        }
    });

    timer = setTimeout(checkState, 1000*60);
}

chrome.extension.onMessage.addListener(function (request, sender, sendResponse) {
    switch (true) {
        case request.restart:
        timer = null;
        loadExtension();
        break;
    }
    return true;
});

$(document).ready(function() {
    loadExtension();
});

【讨论】:

  • 啊哈,所以问题出在setBadgeText 不期待数字。那么是的,''+n 会修复它。
  • 是的,我确实认为它必须包含一个连接到 data.online 的空字符串,我只是没有正确测试它。终于修好了,呸!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多