1

私は firefox 拡張機能を開発しており、firebug:hoverのような要素の状態をシミュレートしたいと考えています。

in my-script-file.jsi は要素オブジェクトをmousehover使用して出力します。たとえば、[0] は jquery オブジェクトではなく DOM 要素を取得することに注意してください。self.port$('#myDiv')[0]

私の問題は、このコードが機能せず、domUtil.setContentState(step.element, 0x04);オンラインでエラーが発生することです。エラーは次のとおりです。

setContentState()の定義については、Firefox のドキュメント サイトにアクセスしましたが、要素は私の質問のインスタンスである必要があることに気付きました。選択したオブジェクトをオブジェクトnsIDOMElementに変換する方法です。elementnsIDOMElement

または、実際に私の質問は、またはjquery関数:hoverによって選択された要素を強制する方法ですか?document.getElementById$()

firebug のソース コードを読んで、次のスニペットを思いつきました。

var {Cc, Ci, Cr} = require("chrome");
var domUtil = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);

exports.main = function() {
    var attachToTab = function(tab)
    {
        if(currentWorker)
            currentWorker.destroy();

        currentWorker = tab.attach({
            contentScriptFile: [data.url("jquery.js"), data.url("my-script-file.js")]
        });

        currentWorker.port.on('mousehover', function(element){
                console.log('doing setContentState :hover');
                domUtil.setContentState(element, 0x04);
        });
    }

    require("widget").Widget({
        id: "MyAddonBtn",
        label: "Sample",
        contentURL: data.url("images/addon.ico"),
        onClick: function(){
            attachToTab(tabs.activeTab);
        }
    });

}
4

1 に答える 1

3

アドオン SDK の動作に問題があります。コンテンツ スクリプトはページ要素にアクセスできますが、高度な権限 (を使用するために必要) はありませんinIDOMUtils。拡張スクリプトには高度な権限がありますが、通常はページ要素にアクセスできません。いいえ、メッセージでページ要素を送信しても機能しません。メッセージは JSON 化できるオブジェクトのみを受け入れます。

唯一の解決策は、SDK フレームワークから抜け出し、拡張スクリプトから直接ページにアクセスすることです。このようなもの:

var attachToTab = function()
{
  var browserWindow = require("window-utils").activeBrowserWindow;
  if (browserWindow && "gBrowser" in browserWindow)
  {
    var doc = browserWindow.gBrowser.contentDocument;
    var element = doc.getElementById("foo");
    if (element)
      domUtil.setContentState(element, 0x04);
  }
};

window-utilsパッケージは低レベルの API であり、文書化がかなり不十分です (たとえばactiveBrowserWindow、プロパティは文書化されていません)。自己責任で使用してください。ただし、現在のブラウザ ウィンドウに直接アクセスできます。そこにgBrowser着いたら、 variable は<xul:tabbrowser> element.

于 2012-04-04T13:02:30.217 に答える