Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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 Safari扩展-如何仅在特定选项卡上设置徽章编号?_Javascript_Safari Extension - Fatal编程技术网

Javascript Safari扩展-如何仅在特定选项卡上设置徽章编号?

Javascript Safari扩展-如何仅在特定选项卡上设置徽章编号?,javascript,safari-extension,Javascript,Safari Extension,如何仅在特定选项卡上设置徽章编号?到目前为止,我有一个代码可以设置所有标签上的徽章编号。。我已经读了很多书,但似乎没有太多关于这方面的信息,所以也许我会在这里找到一个解决方案 我想要像Adblock Plus这样的东西,它为特定选项卡设置徽章编号。这在Chrome等浏览器中非常容易,但在Safari中似乎不是这样 有人知道像Adblock plus这样的扩展如何在特定选项卡上显示徽章编号吗 到目前为止,我只有这个代码,但正如前面提到的,它在所有选项卡上设置了徽章,这不是我想要的结果 safar

如何仅在特定选项卡上设置徽章编号?到目前为止,我有一个代码可以设置所有标签上的徽章编号。。我已经读了很多书,但似乎没有太多关于这方面的信息,所以也许我会在这里找到一个解决方案

我想要像Adblock Plus这样的东西,它为特定选项卡设置徽章编号。这在Chrome等浏览器中非常容易,但在Safari中似乎不是这样

有人知道像Adblock plus这样的扩展如何在特定选项卡上显示徽章编号吗

到目前为止,我只有这个代码,但正如前面提到的,它在所有选项卡上设置了徽章,这不是我想要的结果

safari.extension.toolbarItems[0].badge = 2;
编辑:

我一直在看Adblock plus的源代码,以及其他一些具有此功能的扩展。而且它似乎使用了一些原型

Adblock plus后台代码段:

BrowserAction.prototype = {
_set: function(name, value)
{
  var toolbarItem = getToolbarItemForWindow(this._page._tab.browserWindow);
  if (!toolbarItem)
  {
    return;
  }
  var property = toolbarItemProperties[name];
  if (!property)
  {
    property = toolbarItemProperties[name] = {
      pages: new ext.PageMap(),
      global: toolbarItem[name]
    };
  }
  property.pages.set(this._page, value);
  if (isPageActive(this._page))
  {
    toolbarItem[name] = value;
  }
},
setIcon: function(path)
{
  this._set("image", safari.extension.baseURI + path.replace("$size", "16"));
},
setBadge: function(badge)
{
  if (!badge)
  {
    this._set("badge", 0);
  }
  else if ("number" in badge)
  {
    this._set("badge", badge.number);
  }
}
};
内容脚本(adblockplus.js)


Adblock plus似乎就是这样做的,但到目前为止,我还无法复制它。但仍在努力….

好吧,我终于找到了解决办法,我想我会分享我所做的,以防其他人也遇到同样的情况

今天早上,我想到了将数据存储在一个数组中,当用户访问我想在其中一个网站上显示徽章号码时(不存储用户访问的所有网站),前提是它与我想访问的其中一个网站匹配。我在数组中存储了以下数据:根域(example.com)和徽章号

要使其工作,您需要创建一个目标网站根域的数组,然后仅在匹配时执行以下操作,否则数组将很快填满,我们不希望其中包含太多数据

在全局页面中,首先创建一个空数组来存储数据

var badgeUpdateArray = [];
然后还需要在全局页面中设置消息处理

safari.application.addEventListener('message', handleMessage, false);

function handleMessage(event) {
if(event.name === "setBadgeText"){

    var id = badgeUpdateArray.length + 1;
    var isFound = 0;
    var found = badgeUpdateArray.some(function (el) {
        if(el.identifier === event.message.identifier){
            // Was found
            isFound = 1;
        }
    });
    if (isFound == 0) {
        // Not found, add to the array
        badgeUpdateArray.push({identifier:event.message.identifier,badgeNumber:event.message.badgeNumber});
    }

    // Set the badge number
    safari.extension.toolbarItems[0].badge = event.message.badgeNumber;
}
}
现在我们需要将消息从内容脚本发送到全局页面。您需要获得根域(example.com),我这里不讨论这个问题,因为这很容易。您还需要badgeNumber值,该值可以从任何位置收集(获取请求或其他位置…)

请记住,仅当网站与目标域匹配时才执行此代码

var message = {
        identifier: domain,
        badgeNumber: rows.length
    }
    safari.self.tab.dispatchMessage("setBadgeText", message);
这将发送消息,并将数据存储在阵列中,还将设置徽章编号

现在,为了在不同的选项卡上工作,您需要在全局页面上为
“activate”
创建一个事件处理程序,该处理程序将在选项卡处于活动状态时运行

safari.application.addEventListener("activate", updateBadge, true);

function updateBadge(){

var cDomain = safari.application.activeBrowserWindow.activeTab.url;
cDomain = cDomain.replace("www3.","");
cDomain = cDomain.replace("www2.","");
cDomain = cDomain.replace("www1.","");
cDomain = cDomain.replace("www.","");
cDomain = new URL(cDomain);
cDomain = cDomain.hostname;

var id = badgeUpdateArray.length + 1;
var isFound = 0;
var badgeNumber = 0;
var found = badgeUpdateArray.some(function (el) {
    badgeNumber = el.badgeNumber;
    if(el.identifier === cDomain){
        // Was found, set the badge number
        isFound = 1;
        safari.extension.toolbarItems[0].badge = el.badgeNumber;
    }
});
if (isFound == 0) {
    // Was not found
    safari.extension.toolbarItems[0].badge = 0;
}

}

希望我已经把它都放在这里了,至少有些东西可以用,尽管我不得不说我更喜欢一种更简单的存储方式。。像Chrome etc一样,通过tab API实现了这一点。

没有人拥有任何东西?
safari.application.addEventListener("activate", updateBadge, true);

function updateBadge(){

var cDomain = safari.application.activeBrowserWindow.activeTab.url;
cDomain = cDomain.replace("www3.","");
cDomain = cDomain.replace("www2.","");
cDomain = cDomain.replace("www1.","");
cDomain = cDomain.replace("www.","");
cDomain = new URL(cDomain);
cDomain = cDomain.hostname;

var id = badgeUpdateArray.length + 1;
var isFound = 0;
var badgeNumber = 0;
var found = badgeUpdateArray.some(function (el) {
    badgeNumber = el.badgeNumber;
    if(el.identifier === cDomain){
        // Was found, set the badge number
        isFound = 1;
        safari.extension.toolbarItems[0].badge = el.badgeNumber;
    }
});
if (isFound == 0) {
    // Was not found
    safari.extension.toolbarItems[0].badge = 0;
}

}