2012-01-03 46 views
2

我決定給Mozilla's Add-on Builder一試。我的目錄結構看起來是這樣的:如何從數據中的HTML文件引用Lib中的JavaScript文件?

enter image description here

的問題是,popup.html需要文件引用stackapi.js。但我絕對不知道如何做到這一點。通過瀏覽Mozilla文檔,似乎有辦法做相反的事情:

var data = require("self").data; 
var url_of_popup = data.url("popup.html"); 

這允許Lib中的腳本訪問Data中的數據文件。但我需要做相反的事情。

+0

'../ Lib/what-you-you.js'不工作嗎? – 2012-01-03 01:59:48

+0

@JonPurdy:不,這不起作用。顯然'popup.html'在根目錄下。 – 2012-01-03 02:19:41

回答

3

在使用附加SDK構建的附加組件中(並且構建器僅僅是SDK的Web界面),網頁無法直接訪問擴展模塊 - 它們沒有必要的特權。如果您只需要從網頁中包含JavaScript文件,那麼您應該將該文件放入data目錄中。但是,它不會有任何特殊權限(例如可以撥打require())。

你不告訴你如何使用popup.html但我想這是一個panel。如果您希望該頁面與您的加載項進行通信,則需要使用內容腳本。將內容腳本文件放入data目錄中,通過參數contentScriptFile將其分配給面板。請參見documentation on content scripts,內容腳本將能夠使用self.postMessage()將消息發送到擴展,擴展可以執行必要的操作併發送消息。

2

您可以通過從/data文件夾導航並回落的/lib文件夾,像這樣得到stackapi.js文件的URL:

var url=require("sdk/self").data.url("../lib/stackapi.js"); 

安裝腳本時,然後使用該資源的URL在contentScriptFile參數是什麼我假設將是popup.html

您需要檢查您當前所處的環境,以確定是否需要添加對exports對象的任何引用,以使其可以從插件中訪問。

if(typeof(exports)!="undefined"){ 
    exports.something=function(){...}; 
} 
+0

從Firefox 31開始,只有從SDK的cfx啓動FF時,這種破解纔有效。一旦附加組件被封裝到xpi中,FF就無法找到從'/ data'移動到'/ lib'的庫。 – davide 2014-12-19 04:50:25

0

不得不經過相同的場景,但jongo45的解決方案似乎不工作了。不知何故找到了一個解決方案,爲我工作。在下面發帖,因爲它可能會幫助有需要的人。

下面的代碼獲取「lib/subdir」下所有文件的列表。

const fileIO = require("sdk/io/file");  
const fspath = require("sdk/fs/path"); 
const {Cc, Ci} = require("chrome"); 

const currDir = Cc["@mozilla.org/file/directory_service;1"] 
      .getService(Ci.nsIDirectoryServiceProvider) 
      .getFile("CurWorkD", {}).path; 

const listOfFiles = fileIO.list(fspath.resolve(currDir,'lib/subdir')); 
相關問題