Массив xpcom может передавать в разные файлы xul? - PullRequest
1 голос
/ 06 июня 2010

Сейчас я разрабатываю расширение для Firefox, могу ли я определить глобальный массив в js с помощью основного xul. и я обнаружил, что когда я использую его в другом js с другим xul, он не может работать, поэтому я искал документ по разработке Firefox. Я обнаружил, что общий массив не может быть передан между двумя файлами js с разными файлами xul. а затем я определил xpcom mutablearray в js:

var eleList = Components.classes ["@ mozilla.org/array;1"] .createInstance (Components.interfaces.nsIMutableArray);

но когда я хочу использовать его в другом js: он все еще не работает, почему? Большое спасибо!

1 Ответ

3 голосов
/ 06 июня 2010

Проблема в том, что даже когда вы создаете изменяемый массив, вы сохраняете ссылку на этот объект массива в переменной в контексте XUL, который его создает. Из другого XUL вы не видите эту переменную, поэтому не можете получить доступ к массиву.

Существует несколько решений для доступа к объекту в разных контекстах:

  • Из одного из контекстов получите ссылку на другой контекст. Например, у вас есть переменная, определенная в главном окне (наложение browser.xul), вы можете получить ее из боковой панели, используя менеджер окон, чтобы получить ссылку на главное окно.

  • Вы можете создать свой собственный объект XPCOM, хотя это не так просто сделать, особенно для такого простого случая, как ваш

  • Вы можете использовать модули JavaScript для создания глобального синглтона.

Вам следует рассмотреть возможность использования опции модулей JavaScript. Это самый простой и надежный способ. Он был представлен в Firefox 3.0, и вы можете сделать это, используя только JavaScript без необходимости создания XPCOM

Проверьте здесь для более подробной информации:

https://developer.mozilla.org/en/JavaScript_code_modules/Using_JavaScript_code_modules

ОБНОВЛЕНИЕ:

Вот еще несколько подробностей о том, как получить ссылку на главное окно, чтобы увидеть, какие переменные определены в browser.xul.

Вы определяете переменную в оверлее browser.xul (главное окно):

myArray = [1, 2, 3];

Затем из боковой панели xul вы можете получить ссылку на главное окно и получить доступ к вашей переменной, используя ссылку:

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                    .getInterface(Components.interfaces.nsIWebNavigation)
                    .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                    .rootTreeItem
                    .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                    .getInterface(Components.interfaces.nsIDOMWindow);

var value = mainWindow.myArray[0];

Эти ссылки могут содержать полезную информацию для вас:

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

https://developer.mozilla.org/en/Code_snippets/Tabbed_browser

...