Объекты в JavaScript, определенном и неопределенном одновременно (в расширении FireFox)

Я упорно ищу ошибку в расширении FireFox. Мне наконец удалось видеть его для меня (у меня только были отчеты прежде), и я не могу понять, как то, что я видел, возможно.

Одно сообщение об ошибке от моего расширения в Ошибочной Консоли "gBrowser, не определяется". Это отдельно удивило бы достаточно, так как наложение по browser.xul и navigator.xul, и я ожидаю gBrowser быть доступным от обоих. Еще хуже фактическое место, где это происходит: строка 101 из nextplease.js. Таким образом, в функции isTopLevelDocument, от которого только называют onContentLoaded, от которого только называют onLoad здесь:

gBrowser.addEventListener(this.loadType, function (event) {
    nextplease.loadListener.onContentLoaded(event);
},
true);

Так gBrowser определяется в onLoad, но так или иначе неопределенный в isTopLevelDocument.

Когда я пытался на самом деле использовать расширение, я получил другую ошибку: "nextplease не определяется". Интересная вещь состоит в том, что это произошло на строках 853 и 857. Таким образом, в функциях

nextplease.getNextLink = function () {
    nextplease.getLink(window.content, nextplease.NextPhrasesMap, nextplease.NextImagesMap, nextplease.isNextRegExp, nextplease.NEXT_SEARCH_TYPE);
}

nextplease.getPrevLink = function () {
    nextplease.getLink(window.content, nextplease.PrevPhrasesMap, nextplease.PrevImagesMap, nextplease.isPrevRegExp, nextplease.PREV_SEARCH_TYPE);
}

Так nextplease так или иначе определяется достаточно для вызывания этих функций, но не определяется в них.

Наконец, выполнение typeof(nextplease) в Выполняют возвраты JS "объект". То же для gBrowser.

Как это может произойти? Какие-либо идеи?

16
задан Alexey Romanov 22 February 2010 в 23:17
поделиться

2 ответа

Для второго случая:

nextplease.getNextLink = function () {
    nextplease.getLink(window.content, nextplease.NextPhrasesMap, nextplease.NextImagesMap, nextplease.isNextRegExp, nextplease.NEXT_SEARCH_TYPE);
}

nextplease.getPrevLink = function () {
    nextplease.getLink(window.content, nextplease.PrevPhrasesMap, nextplease.PrevImagesMap, nextplease.isPrevRegExp, nextplease.PREV_SEARCH_TYPE);
}

Я бы попробовал вместо этого:

nextplease.getNextLink = function () {
    this.getLink(window.content, this.NextPhrasesMap, this.NextImagesMap, this.isNextRegExp, this.NEXT_SEARCH_TYPE);
}

nextplease.getPrevLink = function () {
    this.getLink(window.content, this.PrevPhrasesMap, this.PrevImagesMap, this.isPrevRegExp, this.PREV_SEARCH_TYPE);
}
2
ответ дан 30 November 2019 в 23:34
поделиться

Я не уверен, что происходит (в каком контексте выполняется код и, следовательно, почему он не видит gbrowser и другие глобальные переменные), но простым обходным решением для gbrowser, который не определен, будет получение ссылки на главное окно и доступ к нему оттуда:

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

mainWindow.gbrowser.addEventListener( ... )

Это должно работать независимо от контекста, в котором выполняется код, поскольку вы не будете полагаться на глобальные переменные.

1
ответ дан 30 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: