Firefox addon Управление объектами Javascript - PullRequest
3 голосов
/ 09 мая 2011

Привет!
Я отправил свое дополнение на сайт дополнений Mozilla, и редактор вернулся и сообщил мне только одну проблему:

Ваш предварительный запрос на рассмотрение имеет был одобрен.

Вот несколько вещей, которые вам нужно исправить в следующей версии, особенно если Вы хотите подать заявку на полное одобрение:

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

EDIT:
Выложили все дополнения здесь: http://www.mediafire.com/?fff6bjzjy6n39nx

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

Рекомендуется инкапсулировать ваш код в пространство имен, чтобы избежать конфликтов имен. Вот что я всегда делаю в своих аддонах:

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, чтобы убедиться, что оно еще не существует. Затем я добавляю объект Addon, который будет содержать код для моего аддона.

Обратите внимание на объекты "pub" и "self". Каждый метод, который должен вызываться из других объектов, добавляется в объект 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 ...]
}

В блоге Yahoo для библиотеки JavaScript YUI есть хорошая статья о паттерне .

2 голосов
/ 09 мая 2011

Рецензент говорит о вашем коде JS, предполагая, что у вас есть глобальные переменные / функции.

Например:

var x = 1;
function foo() {}

Сравните это с:

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