2011-05-09 32 views
3

嘿!
我提交到Mozilla的附加功能的網站我的添加和編輯回來,告訴我只有一個問題:Firefox插件Javascript對象管理

你的初步審查請求 被批准。

這裏有你需要 固定在你的下一個版本,特別是如果 要申請正式批准的幾件事情:

1)爲了防止 其他插件衝突可能由 用戶安裝,您需要將您的「鬆散」 變量和函數包裝在一個 JavaScript對象中。你可以在 https://developer.mozilla.org/en/XUL_School/JavaScript_Object_Management上看到 的例子。

所以我去那兒,開始讀了...但它的很多東西,感覺就像胡言亂語給我,我感到很困惑(不是很難在所有做!)

使用的第一個例子在那頁上,你能否告訴我如何修改我的xul文件?

目前它看起來像這樣:

<?xml version="1.0"?> 
    <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> 

    <overlay id="quickfilterOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 
<script type="application/x-javascript" src="chrome://quickfilter/content/quickfilter.js"> 
    </script> 
    </overlay> 

提前感謝! [R

編輯:
上傳整個加上這裏:http://www.mediafire.com/?fff6bjzjy6n39nx

+1

我不認爲這個問題是XUL文件 - 這聽起來像問題是JavaScript。你可以編輯你的文章以包含'quickfilter.js'中的所有內容嗎? – 2011-05-09 02:17:02

+0

好吧,將它上傳到一個文件主機:mediafire.com/?fff6bjzjy6n39nx – Ryan 2011-05-09 23:10:13

+1

檢查quickfilter.js,我確信評論者評論所有全局變量(xmlDoc,quickFilter_100_count_redirect_url,countXmlUrl,...,prefManager)。將這些移動到quickfilter_quickfilter或quickfilter_extension對象中,就完成了。 – speedball2001 2011-05-10 07:15:38

回答

3

最好是封裝你的代碼在一個命名空間以避免名稱衝突。這是我總是在我的插件做:

if(!org) var org={}; 
if(!org.janek) org.janek={}; 

org.janek.Addon = function() { 

    var pub = {}; 
    var self = this; 

    pub.init = function() { 
    // 
    // Initialize addon, setup listeners, ... 
    // 
    } 

    ... 

    self.thisIsAPrivateMethod = function(arg) { 
    // method that's only visible inside org.janek.Addon 
    } 

    return pub; 
}(); 


// Init addin after window loaded 
window.addEventListener("load", 
         org.janek.Addon.init, 
         false); 

首先,我創造我自己的名字空間org.janek,確保它不存在。然後我添加將包含我的插件代碼的對象插件。

請注意「酒吧」和「自我」對象。應該從其他對象調用的每個方法都會添加到pub對象中。私人方法被添加到自我。

更具體地講,我會改變quickfilter_extension下面的代碼(我包括全球prefManager對象爲例):

var quickfilter_extension = function() { 
    var pub = {}; 

    // interface for preferences 
    pub.prefManager = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); 

    pub.init = function() { 
     //Initiating the progressListerner 
     gBrowser.addProgressListener(quickfilter_urlBarListener, Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT); 
     //Load the block list xml form server 
     quickfilter_quickfilter.request_xml(); 
    }, 

    pub.uninit = function() { 
     // Remove the progressListerner 
     gBrowser.removeProgressListener(quickfilter_urlBarListener); 
    } 

    return pub; 
}(); 

代碼,使用prefManager對象現在需要經過quickfilter_extension對象:

redirectToAnotherUrl:function() 
{ 
    [ ... omitted ...] 
    qucikFilterRedirectCount = quickfilter_extension.prefManager.getCharPref("extensions.quickfilter_redirect_count"); 

    [ ... omitted ...] 
} 

雅虎的JavaScript庫YUI的博客有一個很好的article about the pattern

+2

'如果my.janek = {}; - (!org.janek)'我想你的意思是'如果org.janek = {};'? – MatrixFrog 2011-05-09 22:40:41

+0

謝謝,修復它。 – speedball2001 2011-05-10 07:07:49

+0

你能指點我一個更簡單的插件嗎?也許我可以下載它,通過代碼一個學習有點... – Ryan 2011-05-10 11:43:54

2

審閱者都在談論你的JS代碼,這意味着你有全局變量/函數。

例如:

var x = 1; 
function foo() {} 

相比之下,與:

MyPluginName = {}; 
MyPluginName.x = 1; 
MyPluginName.foo = function(){} 
+0

哦,我明白了!不幸的是,我對JS很陌生,只是部分地遵循了上面寫的東西。任何專門處理這個問題的教程,適用於像我這樣的新手? - 謝謝! – Ryan 2011-05-09 02:24:16

+1

我發現從[此頁上MDC(HTTPS [本博客文章(http://blogger.ziesemer.com/2007/10/respecting-javascript-global-namespace.html)鏈接://開發商。 mozilla.org/en/Security_best_practices_in_extensions)和一個簡短的瀏覽後,它似乎是一個很好的介紹。 – MatrixFrog 2011-05-09 22:40:12

+0

@matrixfrog,謝謝!將檢查出來! (!org.janek) – Ryan 2011-05-09 23:12:06