Доступ к библиотеке 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.");