Кто-нибудь разбирается в расширениях FireFox?

Feb 06, 2010 17:57

У меня возникла ситуация, совершенно невозможная, по моему пониманию. Описал её на форуме Mozilla Add-ons, но спрошу ещё и тут ( Read more... )

программирование, firefox

Leave a comment

Comments 15

mr_aleph February 6 2010, 16:05:38 UTC
а можешь выложить XPIшку? я бы посмотрел =)

Reply

alexey_rom February 6 2010, 16:20:22 UTC
mr_aleph February 6 2010, 17:09:05 UTC
посмотрел... Сначала об очевидных проблемах:

if (!nextplease) {var nextplease = {};}

у меня здесь случается "nextplease is not defined" и дальше дело не идёт. Кроме того "var" очевидно не глобальная, а локальная переменная.

Дальше: то, что ты называешь глобальными переменными на самом деле не глобальные переменные, а поля объекта window.

Т.е. если ты исполняешь код:

nextplease = {};

то на самом деле происходит

window.nextplease = {};

Если у nextpleaseOverlay.js и nextpleaseOptions.js исполняются в контексте разных window, то очевидно они не будут видеть nextplease.

Итого: делать так нельзя.

А как надо? Мой маленький опыт подсказывает решение, через модули: нужно создать модуль, который бы содержал "глобальные" переменные (на самом-то деле нужна ведь не глобальная переменная, а видимая внутри расширения и не больше) и импортировать его всюду, где эти глобальные переменные нужны.

я сделал эти правки и вроде всё заработало

Reply

alexey_rom February 6 2010, 17:37:30 UTC
у меня здесь случается "nextplease is not defined" и дальше дело не идёт
Хм. Непонятно, почему у меня так не случается.

Кроме того "var" очевидно не глобальная, а локальная переменная.
В любом другом языке мне тоже было бы очевидно, но неоднократно читал, что в JavaScript блоки не вводят scope. Собственно, на первую мою версию дали ссылку http://blogger.ziesemer.com/2007/10/respecting-javascript-global-namespace.html, где в примере того, как надо делать, написано
if(!com) var com={};
if(!com.ziesemer) com.ziesemer={};
if(!com.ziesemer.myPackage) com.ziesemer.myPackage={};

Чего-то опять не понимаю...

Если у nextpleaseOverlay.js и nextpleaseOptions.js исполняются в контексте разных window, то очевидно они не будут видеть nextplease.
Ага! То, что "глобальные переменные" это поля глобального объекта window, я знал, а про то, что эти объекты могут быть разные в одной сессии, не подумал.

Спасибо большое! Сейчас посмотрю на

Reply


Leave a comment

Up