2014-05-10 162 views
2

所以我決定最近創建一個Firefox擴展我一直在想,但是沒有任何使用經驗。我閱讀官方教程,並認爲插件sdk似乎很適合我,但我似乎遇到了使用它的麻煩。如何使用firefox addon sdk創建選項彈出對話框?

我想要做的就是創建一個選項彈出的對話框,類似於你看,如果你按alt-tools-options之一。也就是說,在上部有一個標題和關閉按鈕的邊框,並且在窗口中有一個更大的區域,我可以在其中定義一個「直觀」(用戶習慣使用皮膚的默認元素)GUI。 頂部的標籤(一般,隱私安全等)沒有什麼我真正需要的,雖然也不會傷害。

所以,問題是,從我的搜索,當你使用插件SDK,你不應該使用XUL擁有這些元素,而你似乎應該創造一些自定義的使用HTML in a panel。我不認爲它可能創建類似於真正的選項菜單使用時,頂部酒吧,但如果我錯了,我不介意糾正。

我以前有類似的問題,我想從工具欄中的下拉菜單類似於默認的,我解決了這個問題:How to add a dropdown menu to a firefox addon sdk powered addon toolbar button?。 可能值得注意的是,打開選項對話框的按鈕是按照此處所述創建的菜單項之一。 我在考慮可能(也可能不確定)使用類似於此的東西,但遺憾的是,我不知道如何創建一個可單獨使用的「可拖動」彈出窗口。

如果可能,我寧願存在一個解決方案,但如果有人知道這確實是不可能的,請張貼,所以我可以放棄而不後悔,只是做一些自定義的HTML面板:)

tldr: 有沒有一種方法可以創建一個類似(風格)的選擇窗口,你可以在使用addon sdk進行開發時使用Firefox中的alt-tools-options打開選項窗口?

+0

我不明白你的意思是什麼彈出對話框。你怎麼打開它? – canuckistani

+0

如果你有焦點的Firefox,請嘗試按下按鍵** alt **。這將彈出窗口左上方熟悉的*文件,編輯,...,工具,幫助*按鈕。當您選擇**工具**時,將會出現一個名爲** options **的菜單項。選擇它並彈出對話框出現。如果您只想使用鍵盤,則組合鍵爲** Alt-T-O **。如果您在OP中按鏈接** alt-tools-options **,您還將看到它的截圖。 – felix

+0

你在使用什麼操作系統?我使用的是Mac,根本不適用於我所看到的。 – canuckistani

回答

1

基本上,你不應該,至少不是與SDK。

但話又說回來,它仍然是可能的,但你需要做很多東西自己:

  1. 您需要註冊一個chrome:包爲您的加載項,爲resource:的URI的SDK使用內部不能爲XUL窗口正確工作。創建一個Chrome Registrationchrome.manifest文件)。該SDK自從Firefox 24 IIRC支持這一點。
  2. 創建XUL文件。對於首選項/選項窗口,已經有綁定。看看其他擴展和或Firefox Options dialog(這是一個巨大的事情與多個覆蓋,所以更好看看其他擴展)。將XUL文件放入chrome/content/<somefile>.xul。這將對應於chrome://<registered_package_from_1>/content/<somefile>.xul
  3. 實現將實際顯示窗口的內容。通常,非SDK附加組件只需將em:optionsURL放入其install.rdf即可讓附加組件管理器自動創建一個首選項按鈕,該按鈕將打開指定的URL,但在SDK中,這是從package.json生成的,並且無法將optionsURL in package.json如果我沒有弄錯。但你可以做其他事情,比如使用simple-prefstype: control按鈕在你的about:addons頁面有一個按鈕,或者將它添加到某個瀏覽器菜單(這需要另一堆XUL修改代碼require("chrome"))。要實際打開對話框,您可以使用window/utils.openDialog
  4. 當您的加載項被卸載時,不要忘記關閉所有打開的窗口。

正如你所看到的,而不是一個簡單的任務... 如果只是一般的喜好後的時候,可以考慮使用simple-prefs

+0

謝謝,還沒有時間來嘗試它,但它絕對看起來很有希望。一旦我嘗試過,會回到這裏併發布我的結果。以前看過* simple-prefs *,但據我所知我無法做到我想要的東西,因爲我需要顯示「訂閱」的用戶列表,並且可以添加/編輯他們(用戶告訴插件創建我稱之爲'訂閱'的任意數量:本質上只是一個url,一個html標籤類和一個正則表達式。這個正則表達式定期在這些標籤outerHTML上執行,如果結果改變了,用戶被通知)。 – felix

+0

因此,在嘗試了你所說的話後,我似乎已經得到了它的大部分工作。謝謝您的幫助!我認爲值得一提的是,有人偶然會在未來發生這種情況:**#1 **中的鏈接對我有很大幫助,但chrome.manifest中的** content **命令需要寫入'內容包名chrome/content/pathtofiles /'(如需要**「chrome /」**部分)。我被困了一段時間,因爲我不知道:P。 Character_limit,在下一個評論中繼續... – felix

+0

另一件值得一提的事情是,我從來沒有得到** OpenDialog **來工作,並且最終不得不使用** Open **來代替('var winUtils2 = require('sdk/window/utils'); var dialog = winUtils2.open(「chrome://custom_options/content/options.xul」,「」,「」);')。現在我只需要弄清楚如何使** self.port **工作,或者找到另一種方法將數據發送回原始腳本,這個問題就可以解決。幸運的是,我懷疑[Passing_data_between_windows](https://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code#Passing_data_between_windows)會幫助我解決這個問題。 – felix

相關問題