1

我正在开发一个 firefox 扩展,我想模拟:hover像 firebug 这样的元素的状态。

my-script-file.js我将mousehover使用self.port元素对象发出,例如$('#myDiv')[0]注意 [0] 是获取 DOM 元素而不是 jquery 对象。

我的问题是这段代码不起作用,并且会domUtil.setContentState(step.element, 0x04);在线引发错误。错误是:

我进入了setContentState()定义的 firefox 文档站点,我注意到我的元素必须是nsIDOMElement我的问题的一个实例,这里是如何将我的选择转换elementnsIDOMElement对象。

或者实际上我的问题是如何强制使用或 jquery函数:hover选择的元素?document.getElementById$()

我阅读了萤火虫源代码并提出了这个片段:

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-utilspackage 是低级 API 并且文档记录很差(例如文档activeBrowserWindow中没有属性) - 使用风险自负。但它可以直接访问当前浏览器窗口。一旦你在那里,gBrowser变量会给你<xul:tabbrowser> element

于 2012-04-04T13:02:30.217 回答