2012-04-04 99 views
1

我正在開發一個firefox擴展,我想模擬像螢火蟲這樣的元素的狀態:hover如何設置:懸停狀態的DOM元素使用inIDOMUtils :: setContentState?

my-script-file.js我將使用self.port與元素對象例如$('#myDiv')[0]注意,[0]是獲得DOM元素不是一個jquery對象發射mousehover

我的問題是這個代碼不會工作,並會在domUtil.setContentState(step.element, 0x04);行提出一個錯誤。 錯誤是:

我在Firefox文檔站點去了setContentState()定義和我notited我的元素必須是nsIDOMElement我的問題實例這裏是如何的我所選擇elementnsIDOMElement對象轉換。

其實我這裏的問題是如何在document.getElementById或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

哇哇,真的非常感謝你的信息和片段。 – 2012-04-04 13:18:45

相關問題