1

再起動のないアドオンで次のようなバインディングを適用しています:

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これは、 「Whole Word Only」というラベルの付いたボタンを追加するだけです。しかし、今はそれを削除するために、スタイルシートの登録を解除していますがmyServices.sss.unregisterSheet(cssUri, myServices.sss.USER_SHEET);、これはバインドを解除していません。

ask.mozilla.org での回答によると、これは予想される動作であるとのことでしたが、解決策はありませんでした。

CSS 経由ではなくバインディングを動的に追加する必要があるのではないかと考えていました。これはテストしていませんが、XBL 更新の 3 つの理由に適合しません。

  1. バインドされた要素が、別のバインディングを指定するスタイル ルールに一致する
  2. バインドされたドキュメントから要素が削除されます
  3. 要素が破棄された (たとえば、ドキュメントを閉じることによって)

答えは、それが予想されるがファンキーな動作であると私に言いました。

4

1 に答える 1

1

さて、私は、本質的に異なる XBL バインディングを (再) バインドするいくつかの実用的なコードがあることを思い出しました。

こんなふうになります:

  • ベースバインディングがあるかどうか(あなたの場合は元のバインディング.findbar-container)。
  • 次に、異なる を定義する複数のクラスがあります-moz-binding
  • これらのクラスは、実行時に設定および削除されます。

それは私にとってはうまくいくので、理論的にはうまくいくはずです:

  • あなたのスタイルでは、要素自体のルールはありませんが、クラスのルールはありません。

    .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を助けることができます...

于 2014-06-25T14:32:02.380 に答える