Доступ к библиотеке JavaScript в iframe в скрипте greasemonkey

Я пытаюсь получить доступ к Dojo в моем веб-приложении, и у меня возникают проблемы с получением того, что мне нужно. В частности, у меня есть веб-приложение в iframe с различными версиями Dojo:

В Firebug я могу сделать это:

window.dojo.version; // 1.7
window.frames[0].window.dojo.version; // 1.0

(Обратите внимание, что iframe находится в том же домене, что и родительский)

В GreaseMonkey я не могу найти ни одну версию Dojo:

dojo // undefined
window.dojo // undefined
window.frames[0].window.dojo // undefined 

Я начал изучать unsafeWindow который якобы не должен использовать. Это дает мне доступ к оконному додзё, но не к тому, которое я на самом деле хочу.

unsafeWindow.dojo.version // 1.7 (wrong version)
unsafeWindow.frames[0].dojo // undefined 
unsafeWindow.frames[0].window.dojo // undefined
window.frames[0].window.dojo // undefined
window.frames[0].unsafeWindow // undefined
window.frames[0].window.unsafeWindow // undefined

я пробовал withDoc но я подозреваю, что я использую это неправильно:

unsafeWindow.dojo.withDoc(window.frames[0].window, function(){
    var dijit = unsafeWindow.dijit; // seems wrong; doesn't work
    var widget = dijit.byId('someWidgetInsideIframe');
    console.log(widget); // undefined
}, this);

Любые предложения о других вещах, которые я могу попытаться получить доступ к Dojo 1.0 в iframe? Или, если не так, хотя бы выясните, как получить доступ к виджетам додзё, определенным в iframe, с помощью додзё, к которому у меня есть доступ?

1 ответ

Решение

Я бы ожидал unsafeWindow.frames[0].window.dojo.version; работать, когда GM работает на главной странице (см. ниже). Тот факт, что это не так, на мой взгляд, ошибка, но ведущий разработчик GM может не согласиться. Подумайте о регистрации сообщения об ошибке.

Однако Greasemonkey обычно обрабатывает фреймы / фреймы, как если бы они были отдельными страницами (за некоторыми исключениями). Это означает, что скрипт будет запускаться один раз для главной страницы и один раз для каждого кадра, чей src соответствует @include/@exclude/@match директивы. Это также означает, что такие вещи, как window.frames[0] не будет определен в каждом проходе.

Вы можете сказать, что находитесь в правильном кадре с кодом, подобным этому:

if (window.self == window.top.frames[0]) {
    //-- Currently running in the target frame
    unsafeWindow.console.log ("dojo.version:", unsafeWindow.dojo.version);
}
else
    unsafeWindow.console.log ("These are not droids... Or, er something.");
Другие вопросы по тегам