我在不重新启动的插件中应用这样的绑定:
var css = '.findbar-container { -moz-binding:url("' + self.path.chrome + 'findbar.xml#matchword") }';
var cssEnc = encodeURIComponent(css);
var newURIParam = {
aURL: 'data:text/css,' + cssEnc,
aOriginCharset: null,
aBaseURI: null
}
cssUri = Services.io.newURI(newURIParam.aURL, newURIParam.aOriginCharset, newURIParam.aBaseURI);
myServices.sss.loadAndRegisterSheet(cssUri, myServices.sss.USER_SHEET);
findbar.xml
内容为:
<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="matchword">
<content>
<children/>
<xul:toolbarbutton anonid="matchwordbtn" accesskey="w" class="tabbable" label="Whole Word Only" tooltiptext="Match only whole words" oncommand="console.log('hi')" type="checkbox"/>
</content>
</binding>
</bindings>
这只会在标有“仅限全字”的FindBar
上添加一个按钮。但是现在要删除它,我只是使用myServices.sss.unregisterSheet(cssUri, myServices.sss.USER_SHEET);
取消注册样式表,但这并不是解除绑定。
answer on ask.mozilla.org告诉我这是预期的行为,但没有提供解决方案。
我想也许我应该动态添加绑定而不是通过CSS,我没有测试这个,但它不符合XBL更新的3个原因:
- 绑定元素与指定不同绑定的样式规则匹配
- 该元素已从绑定文档中删除
- 元素被销毁(例如,通过关闭文档)
醇>
答案告诉我,这是一种时髦的行为。
答案 0 :(得分:1)
好吧,我记得我有一些工作代码可以(重新)绑定不同的XBL绑定,基本上。
它是这样的:
.findbar-container
的原始绑定)。-moz-binding
s。因为这对我有用,理论上它应该适合你:
在你的风格中,没有元素本身的规则,但是对于一个类,例如
.findbar-container.myaddonclass { moz-binding: ... }
在您的代码中,在加载时添加新类,例如
Array.forEach(
document.querySelectorAll(".findbar-container"),
e => e.classList.add("myaddonclass")
);
在您的代码中,卸载时再次删除该类:
Array.forEach(
document.querySelectorAll(".findbar-container"),
e => e.classList.remove("myaddonclass")
);
这应该强制CSS规则重新评估,并且绑定重新评估,因此适合“绑定元素匹配指定不同绑定的样式规则”规则。
当然,如果并非您想要重新绑定的所有元素都已加载到加载项中,那么这很糟糕,但MutationObserver
可能有助于...