2012-04-04 14 views
1

私はfirefox extensionを開発しています。私はfirebugのような要素の:hover状態をシミュレートしたいと思います。設定方法:inIDOMUtils :: setContentStateを使用してDOM要素のホバー状態を設定しますか?

my-script-file.jsに私は[0] DOM要素ではないjQueryオブジェクトを取得することであることを要素オブジェクトなど$('#myDiv')[0]ノートでself.portを使用してmousehoverを放出します。

私の問題は、このコードはうまく動作せず、domUtil.setContentState(step.element, 0x04);行にエラーが発生します。 エラーがある:私はsetContentState()定義については、Firefoxのドキュメントサイトに行って、私はここで私の選択elementnsIDOMElementにオブジェクトを変換する方法である私の要素がnsIDOMElement私の質問のインスタンスでなければなりませんnotited

実際には私の質問は、またはjquery $()によって選択された要素に:hoverを強制的に強制する方法です。

私は放火犯のソースコードを読んで、このスニペットを思い付く:

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); 
     } 
    }); 

} 

答えて

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変数はあなたに<xul:tabbrowser> elementを与えます。

+0

あなたの情報とスニペットに感謝します。 –

関連する問題