Как мне сравнить Application.windows [x] с Application.ActiveWindow?

#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.