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