【问题标题】:Accessing javascript library in iframe in greasemonkey script在greasemonkey脚本中访问iframe中的javascript库
【发布时间】:2012-06-05 17:06:14
【问题描述】:

我正在尝试在我的 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 的其他事情有什么建议吗?或者,如果不是这样,至少弄清楚如何使用我 do 有权访问的 Dojo 访问 iframe 中定义的 dojo 小部件?

【问题讨论】:

    标签: dojo greasemonkey scriptish


    【解决方案1】:

    我希望unsafeWindow.frames[0].window.dojo.version; 能够在 GM 在主页上运行时工作(见下文)。在我看来,这不是一个错误,但首席 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.");
    

    【讨论】:

    • 修复: GreaseMonkey 1.0 添加了@grant 修饰符。在我的情况下,声明@grant none 解决了我的问题。见wiki.greasespot.net/@grant
    • 这并没有修复错误,它只是绕过了沙箱。但只要您不需要使用某些 GM_ 函数,它就可以工作。
    • 这是我能从 GreaseMonkey 人 (github.com/greasemonkey/greasemonkey/issues/1625) 那里得到的唯一答案,而且就他们而言,在 iframe 中使用 JS 库非常难闻,而且对我来说非常具体需要。到那时,也许关闭沙盒并不是一个可怕的选择。
    • 是的,很抱歉,首席 GM 开发人员没有解决这个错误。我警告他可能不会;他做了很多错误的决定。这就是为什么一些高级用户切换到 Scriptish 或他们自己的内部分支的原因。 (但总体而言,GM 仍然是一个很好的工具——到目前为止,拥有最大的安装基础。)
    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多