Расширение Firefox js инициализация объекта - PullRequest
1 голос
/ 07 мая 2010

Примечание: речь идет о расширении Firefox, а не об общем вопросе js.

В проекте расширения Firefox мне нужно, чтобы мой объект javascript инициализировался только один раз заОкно Firefox.В противном случае каждый раз, когда я открываю свое окно, будут задействованы новые таймеры, будут использоваться новые свойства, поэтому все будет начинаться с нуля.

Надеюсь, приведенный ниже пример прояснит мой вопрос:)

var StupidExtension
{
    statusBarValue: "Not Initialized Yet",
    startup: function ()
    {
    ...
    // Show statusBarValue in Status Bar Panel
    },
    initTimerToRetrieveStatusBarValueFromNetwork: function ()
    {
    ...
    }   
}

таким образом, каждый раз, когда вы нажимаете Ctrl + N в новом окне, вы увидите «Пока не инициализировано», а затем будет запущен новый таймер, поэтому через некоторое время при получении данных из сети вы увидите значение также во втором окне и так далее.В идеале было бы необходимо запустить только одну функцию таймера и обновить все панели строки состояния во всех окнах Firefox.

Конечно, я могу выполнить некоторое кэширование, например сохранить значение в prefs или каком-либо другом хранилище, а затем показать егооттуда.Но я чувствую, что это искусственно.

Таким образом, вопрос будет в том, есть ли «нативный» метод создания статических некоторых частей объекта среди всех оконных окон Firefox?

Ответы [ 2 ]

1 голос
/ 07 мая 2010

https://developer.mozilla.org/en/Working_with_windows_in_chrome_code#Advanced_data_sharing

Импорт модуля js (который вам нужно написать) во всех окнах.Это дает вам общий объект для всех них.

В модуле реализуйте код таймера и либо используйте стандартную службу наблюдателя для отправки уведомлений всем окнам (вызовы обратного вызова таймера .notify() всякий раз, когда необходимо обновить окна, в каждом окне есть наблюдатель, зарегистрированный с помощью .addObserver()), или реализуйте свои собственные методы addObserver / removeObserver для объекта, экспортируемого из jsm.

0 голосов
/ 07 мая 2010

Если в вашем файле манифеста chrome есть что-то вроде:

 overlay chrome://browser/content/browser.xul chrome://path/to/youroverlay.xul

И этот оверлей имеет включение в somejsfile.js

и внутри somejsfile.js у вас есть это:

var myExtension = {
    statusBarValue: "Not Initialized Yet",
    startup: function startup(){
     // Show statusBarValue in Status Bar Panel
     },
}

window.addEventListener("load", function() { myExtension.startup(); }, false);

Принимая во внимание все, что я только что сказал, когда пользователь открывает новое окно, запуск будет запускаться для каждого окна, и statusBarValue должен быть "Пока не инициализирован" независимо от того, что находится в другом окне.

Поскольку вы перекрываете browser.xul, и у каждого окна есть свое ... у каждого своя версия вашего расширения. (Обратите внимание, что это новое окно, а не новая вкладка.)

Так что да, вам, вероятно, придется как-то их синхронизировать, используя технику, аналогичную той, которую вы упомянули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...