문제

I'm trying to access Dojo within my webapp, and having issues getting what I need. Specifically, I have a webapp in an iframe with different versions of Dojo loaded:

In Firebug, I can do this:

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

(Note iframe is in same domain as parent)

In GreaseMonkey, I can't find either version of Dojo:

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

I started looking into unsafeWindow which supposedly I shouldn't use. It gives me access to the window'd Dojo, but not the iframe'd dojo I actually want.

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

I've tried withDoc but I suspect I'm using it incorrectly:

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

Any suggestions on other things I can try to get access to Dojo 1.0 in the iframe? Or if not that, at least figure out how to get access to dojo widgets defined in the iframe using the Dojo I do have access to?

도움이 되었습니까?

해결책

I would expect unsafeWindow.frames[0].window.dojo.version; to work when GM is running on the main page (see below). The fact that it doesn't is a bug in my opinion, but the lead GM dev might not agree. Consider filing a bug report.

However, Greasemonkey normally processes frames/iframes as though they were standalone pages (with some exceptions). This means that the script will fire once for the main page and once for each frame whose src matches the @include/@exclude/@match directives. This also means that things like window.frames[0] will not be defined in every pass.

You can tell you are in the right frame with code like this:

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.");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top