在greasemonkey脚本中访问iframe中的javascript库

时间:2012-06-05 17:06:14

标签: dojo greasemonkey scriptish

我正在尝试在我的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小部件?

1 个答案:

答案 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.");