2

使用样式表服务的手风琴

上述文件还指出:

如果 CSS 包含 #id,则 loadAndRegisterSheet 失败。'#' 必须是百分号编码,详情见 bug 659650。

行李报告于 2011-05-25 进行。它仍然是一个错误还是已经解决?

还有另一种添加 CSS 的方法,但这是每个窗口,我更喜欢对这个进行排序。

更新:
这是样式表的内容

#rpnethelper-separator2:last-child { display: none; }
#rpnethelper-menuitem {
  list-style-image: url('icon16.png');
}

这是实际代码(加上添加的控制台调用)

register: function(css) {

  let sss = Components.classes['@mozilla.org/content/style-sheet-service;1']
                  .getService(Components.interfaces.nsIStyleSheetService);
  let cssURI = Services.io.newURI(css, null, null);
  sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);
},

我试过了try{} catch{},我没有得到任何错误。
如何/在哪里可以USER_SHEET查看?

现在,我将使用内联样式(不支持伪类),但我仍然想解决这个问题。

最终更新:
由于某种原因,无法使用的代码,在有趣的事情上USER_SHEET工作得很好AUTHOR_SHEET
,毕竟,我认为只为一个伪类进行额外处理是不值得的,所以我选择了(简单)内联样式

4

1 回答 1

3

您忘记指定正确的命名空间。将以下内容作为第一行添加到您的工作表中。

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

您已经链接的文档状态:

使用此服务添加的样式表适用于 chrome 和内容文档。如果要将样式表应用于 XUL 文档,请记住声明正确的名称空间。

此外,如果您的目标是 Firefox 18 及更高版本(实际上,支持早期版本没有任何优点,因为这些版本不受支持且包含已知的安全漏洞,因此用户不应使用它们),您应该考虑nsIDOMWindowUtils.loadSheet改用。这只会将工作表加载到实际窗口中,而不是将其全局应用于所有窗口,包括。网站。

if (window instanceof Ci.nsIInterfaceRequestor) {
  let winUtils = window.getInterface(Ci.nsIDOMWindowUtils);
  let uri = Services.io.newURI(..., null, null);
  winUtils.loadSheet(uri, Ci.nsIDOMWindowUtils.AUTHOR_SHEET);
  // Remove with winUtils.removeSheet() again on shutdown
}

编辑AUTHOR_SHEET大部分时间都希望使用(无论是样式表服务还是窗口实用程序)。这更等同xml-stylesheet于叠加层。

loadAndRegisterSheet fails if CSS contains #id. '#' must be percent-encoded, details see bug 659650.

行李报告于 2011-05-25 进行。它仍然是一个错误还是已经解决?

该错误报告仅适用于data:URI。此外,该错误报告是无效的,#在 URI 中具有特殊含义,因此当它直接作为 URI 的一部分时(与data:URI 一样),您必须对其进行编码。如果您注册的是常规chrome:/// URI resource:,则不需要特殊编码file:http:

于 2014-07-02T13:23:56.637 回答