#javascript #firefox #firefox-addon #xul
#javascript #firefox #firefox-дополнение #xul
Вопрос:
Я создаю расширение Firefox, в котором я хочу выполнить итерацию по Application.windows
массиву и проверить, совпадает ли один из его элементов с Application.activeWindow
.
Упомянутый отрывок из моего кода выглядит следующим образом:
for (var i in Application.windows) {
if (Application.windows[i]==Application.activeWindow) alert('debug');
// there was some more complex code than alert('debug'),
// but since it didn't work, I decided to try with an alert
}
К сожалению, предупреждение ‘debug’ никогда не просматривается. Поэтому я решил попробовать этот код (с открытым только одним окном):
// the following code runs in an event listener for window.onload
alert(Application.windows[0]);
alert(Application.activeWindow);
alert(Application.windows[0]==Application.activeWindow);
Firefox отобразил 3 предупреждения: первое было [object Object]
, второе — [xpconnect wrapped fuelIWindow]
, а в последнем (что меня не удивило) говорилось false
. Похоже, объекты, которые я пытаюсь сравнить, имеют разные типы. Как я могу с этим справиться? Заранее спасибо.
Ответ №1:
У вас две проблемы.
Во-первых, XPConnect не поддерживает свойства со значением массива, поэтому, когда FUEL (или STEEL, или SMILE) возвращает массив, они фактически возвращают nsIVariant внутренних объектов! С другой стороны, однозначные объекты возвращают оболочку XPConnect, которая скрывает внутренний объект.
Во-вторых, каждый раз, когда вы обращаетесь к Windows или ActiveWindow, создаются новые внутренние объекты, поэтому даже два вызова ActiveWindow возвращают разные объекты.
Способ обойти это — избежать FUEL и перечислить окна напрямую, используя window mediator.
Комментарии:
1. Спасибо за решение и за ценную информацию. Мне удалось достичь желаемого результата с помощью window mediator.