2011-11-07 22 views
2

我想使用附加SDK在Firefox附加頁面上操縱XUL元素。我不介意使用低級模塊。我使用DOM檢查器來查看附加頁面的結構。它看起來像這樣的附加頁:使用Firefox附加SDK訪問XUL元素

#document 
--page (id='addons-page', windowtype='Addons:Manager', etc.) 
----... 
----hbox 
----hbox 
----etc. 

所以,我想這段代碼在exports.main:

let delegate = { 
    onTrack: function(window) { 
    console.log('window is being tracked: ' + window); // outputs [object ChromeWindow 

    let doc = window.document; 
    var addOnPage = doc.getElementById('addons-page'); 
    console.log(window.document.page); // outputs undefined 
    console.log(addOnPage);    // outputs null 

    var xulElements = window.document.getElementsByClassName('addon-control'); 

    console.log('our elements: ' + xulElements); // outputs [object HTMLCollection] 
    console.log('our elements length: ' + xulElements.length); // outputs length of 0 
    } 
}; 
var tracker = new winUtils.WindowTracker(delegate); 

的第一個問題是,當Firefox是窗口跟蹤器只開放首先開始。我怎樣才能讓它聽,並等待附加頁面打開?

第二個問題(可能與第一個問題有關)是獲取元素似乎沒有工作(xulElements.length爲0)。

任何想法?

回答

2

兩個問題在這裏:

  1. 加載項管理器通常不打開,因爲這樣使用WindowTracker是毫無意義的一個單獨的窗口。這是一個加載到瀏覽器中的頁面。
  2. 在您有機會加載之前訪問該窗口並不奇怪,您沒有看到任何元素。

鑑於page-mod module似乎不適用於此頁面,因此傾聽chrome-document-global-created notification可能是最佳解決方案。此代碼適用於我:

var observers = require("observer-service"); 
observers.add("chrome-document-global-created", function(wnd) 
{ 
    if (wnd.location.href == "about:addons") 
    { 
    // Wait for the window to load before accessing it 
    wnd.addEventListener("load", function() 
    { 
     console.log(wnd.document.getElementsByClassName('addon-control').length); 
    }, false); 
    } 
}); 
+0

是的。但由於某種原因操縱xul似乎不起作用,我補充道:'var elements = wnd.document.getElementsByClassName('addon-control'); console.log('get attribute:'+ elements [5] .getAttribute('label'));elements [5] .setAttribute('label','some label');'但沒有任何變化... – Salami

+0

@Salami:這是一個無關的問題,但由於您已經在使用DOM Inspector,因此您可以驗證:a)代碼確實會更改正確元素上的標籤,b)通過DOM Inspector更改標籤具有期望的效果。我想如果你嘗試的話,你會自己想出來。如果沒有 - 創建一個新問題並解釋你想達到的目標。 –