1

我正在尝试在我的 web 应用程序中访问 Dojo,但在获取所需内容时遇到了问题。具体来说,我在 iframe 中有一个 webapp,加载了不同版本的 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我不应该使用哪个。它使我可以访问 window'd Dojo,但不是我真正想要的 iframe'd dojo。

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);

关于我可以尝试在 iframe 中访问 Dojo 1.0 的其他事情有什么建议吗?或者,如果不是这样,至少要弄清楚如何使用我可以访问的 Dojo 访问 iframe 中定义的 dojo 小部件

4

1 回答 1

1

我希望当 GM 在主页上运行时unsafeWindow.frames[0].window.dojo.version;工作(见下文) 。在我看来,这不是一个错误,但首席 GM 开发人员可能不同意。考虑提交错误报告

然而Greasemonkey 通常会像处理独立页面一样处理框架/iframe(有一些例外)。这意味着该脚本将为主页触发一次,并为与 //指令匹配src的每个框架触发一次。这也意味着不会在每次传递中都定义类似的东西。@include@exclude@matchwindow.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.");
于 2012-06-05T20:44:56.867 回答