1

Web アプリケーション内で Dojo にアクセスしようとしていますが、必要なものを取得するのに問題があります。具体的には、さまざまなバージョンの Dojo がロードされた iframe に webapp があります。

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 化された 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

unsafeWindow.frames[0].window.dojo.version;GM がメイン ページで実行されているときに動作することを期待します (以下を参照)。そうでないという事実は私の意見ではバグですが、リード GM 開発者は同意しないかもしれません。バグ レポートを提出することを検討してください。

ただしGreasemonkey は通常、フレーム/iframe をスタンドアロンのページであるかのように処理します (例外もあります)。つまり、スクリプトはメイン ページに対して 1 回、 / /ディレクティブsrcに一致する各フレームに対して 1 回実行されます。これは、次のようなものがすべてのパスで定義されるわけではないことも意味します。@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 に答える