为什么这个chrome.browserAction.setIcon方法不起作用?

时间:2015-04-29 14:16:48

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

I'm looking at the documentation page我无法弄清楚代码中的错误:

chrome.browserAction.setIcon({
  details.imageData = {
    "48": "Icons/iconfavorite48x.png",
    "64": "Icons/iconfavorite64x.png",
    "128": "Icons/iconfavorite128x.png"
  }
});

文件说:

  

请注意' details.imageData = foo'相当于   ' details.imageData = {' 19':foo}'

所以我非常困惑

2 个答案:

答案 0 :(得分:28)

您的代码基本上是一个很大的语法错误。 JavaScript对象文字期望是对key: value的列表。您无法(并且不需要)key部分中的任何作业。

因此,修复语法错误,它将是:

// Still wrong:
chrome.browserAction.setIcon({
  imageData : {
    "48": "Icons/iconfavorite48x.png",
    "64": "Icons/iconfavorite64x.png",
    "128": "Icons/iconfavorite128x.png"
  }
});

这会失败。 imageData期望获得像素数据的二进制blob,例如,来自<canvas>。如果要提供路径,则需要使用path属性:

// Still wrong:
chrome.browserAction.setIcon({
  path : {
    "48": "Icons/iconfavorite48x.png",
    "64": "Icons/iconfavorite64x.png",
    "128": "Icons/iconfavorite128x.png"
  }
});

请注意,您只能提供所需的尺寸。如果包含任何其他内容,则会失败。引用文档:

  

如果适合一个屏幕空间单位的图像像素数等于比例,则将选择尺寸比例为* 19的图像。最初只支持第1和第2级。

正常大小的图标是19x19像素;在高DPI屏幕上,Chrome可能会显示38x38图标。

更新:由于Chrome已经在53中切换到Material Design,现在分别需要16x16和32x32。您可以毫无错误地提供旧尺寸和新尺寸。

所以你可以这样做:

// Correct
chrome.browserAction.setIcon({
  path : {
    "19": "Icons/iconfavorite19x.png",
    "38": "Icons/iconfavorite38x.png"
  }
});

// Also correct
chrome.browserAction.setIcon({
  path : {
    "19": "Icons/iconfavorite19x.png"
  }
});

// Also correct
chrome.browserAction.setIcon({
  path : "Icons/iconfavorite19x.png"
});

图像不具有具有这些尺寸,如有必要,它们将被缩放;但它确实更准确。

答案 1 :(得分:1)

对于清单版本 3,您必须使用 chrome.action.setIcon 而不是 chrome.browserAction.setIcon

例如,单独文件夹中的灰色图像:

   chrome.action.setIcon({
        path: {
            "16": "/icons/gray/icon16.png",
            "19": "/icons/gray/icon19.png",
            "32": "/icons/gray/icon32.png",
            "48": "/icons/gray/icon48.png",
            "128": "/icons/gray/icon128.png"
        }
    });

或者,如果不是问题的一部分,也可以通过 setBadgeText 解决:

state 是我自己的变量。

chrome.action.setBadgeText({
  text: (state ? 'off' : '')
});

chrome.action.setBadgeBackgroundColor({
  color: '#2f2f2f'
});