我正在尝试在我的webapp中访问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
,据说我不应该使用它。它让我可以访问窗口的Dojo,但不能访问我真正想要的iframe的道场。
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 I do 访问iframe来访问iframe中定义的dojo小部件?
答案 0 :(得分:1)
当GM在主页上运行时,我希望unsafeWindow.frames[0].window.dojo.version;
能够 。事实上,它不是我认为的错误,但领先的GM开发者可能不同意。考虑filing a bug report。
然而,Greasemonkey normally processes frames/iframes as though they were standalone pages(有一些例外情况)。这意味着脚本将针对主页面触发一次,针对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.");