Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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 动态解除绑定的XBL的动态方式_Javascript_Firefox_Firefox Addon_Xul_Xbl - Fatal编程技术网

Javascript 动态解除绑定的XBL的动态方式

Javascript 动态解除绑定的XBL的动态方式,javascript,firefox,firefox-addon,xul,xbl,Javascript,Firefox,Firefox Addon,Xul,Xbl,我正在一个无重启的附加组件中应用这样的绑定: 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,

我正在一个无重启的附加组件中应用这样的绑定:

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)注销样式表,但这并不是解除绑定

安告诉我这是预期的行为,但没有提供解决方案

我在想,也许我应该动态添加绑定,而不是通过CSS,我没有对此进行测试,但它不符合XBL更新的3个原因:

  • 绑定元素与指定不同绑定的样式规则匹配
  • 元素将从绑定文档中删除
  • 元素被销毁(例如,通过关闭文档)

  • 答案告诉我,这是一种预期的但却很时髦的行为。

    好吧,我只是记得我有一些可以(重新)绑定不同XBL绑定的工作代码

    事情是这样的:

    • 是否存在基本绑定(在您的示例中是
      .findbar container
      的原始绑定)
    • 然后我有多个类定义不同的
      -moz绑定
    • 这些类在运行时设置和删除
    既然这对我有效,理论上应该对你有效:

    • 在您的样式中,不要为元素本身设置规则,而是为类设置规则,例如

      .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规则,并使用该规则绑定重新评估,因此符合“绑定元素匹配指定不同绑定的样式规则”规则


    当然,当并非所有要重新绑定的元素都已加载到您的加载项时,这很糟糕,但可能会有帮助……

    PS:下面是我使用的一些代码。而且.我更深入地研究了这一点,之所以我使用
    .findbar容器{moz binding:…}
    ,是因为findbar现在在所有选项卡中都是分离的,并且在用户第一次在选项卡中执行ctrl+f之前它不会初始化,所以如果我决定用自定义类添加它,我必须侦听并响应findbar的初始化。因此,我正在寻找一种触发xbl回流的方法,我尝试设置虚拟类名,但没有触发它,我正在尝试找到一种方法。编辑:哦,我看到你用MutationObserver解决了这个问题,我正试图在关机时迭代以清除绑定所附加的内容