【问题标题】:Accessing and modifying tabs opened using window.open in Google Chrome在 Google Chrome 中访问和修改使用 window.open 打开的标签页
【发布时间】:2010-04-08 06:27:57
【问题描述】:

我曾经能够这样做来创建一个包含一些数据的导出 HTML 页面。但该代码不适用于最新版本的谷歌浏览器(它适用于 Chrome 5.0.307.11 测试版和所有其他主要浏览器)。

function createExport(text) {  
    var target = window.open();  
    target.title = 'Memonaut - Exported View';  
    target.document.open();  
    target.document.write(text);  
    target.document.close();  
}

Chrome 现在会抱怨域不匹配,并且不允许 JavaScript 调用不安全。在这种情况下,如何访问和修改新打开的浏览器标签的文档?

【问题讨论】:

    标签: javascript google-chrome webkit


    【解决方案1】:

    在使用 file:// 协议(在 Linux 下的 Chromium 5.0.342.9(Developer Build 43360)中)使用本地页面时,我也遇到了这个问题。确切的错误信息是:

    不安全的 JavaScript 尝试访问 带有 URL 的框架:框架中的空白 带网址 文件:///home/foo/bar/index.htm。 域、协议和端口必须 匹配。

    显然协议不匹配,但好消息是:当这个页面在 web 服务器上时,Chromium 也会打开一个新窗口“about:blank”,但它不再抱怨了。当使用通过http://localhost 访问的本地网络服务器时,它也可以工作。

    编辑:关于这个有错误filed upstream。根据this comment的说法,它已经修复,很快就会被卷入主干。

    更新:此错误现已修复,以下测试用例可以正常工作:

    var target = window.open();
    target.title = 'Memonaut - Exported View';
    target.document.open();
    target.document.write("test");
    target.document.close();
    

    【讨论】:

    • 很奇怪,它只发生在 file:// 上。 :S。 about:blank 与 http:// 具有相同的协议匹配,但与 file://...“特殊情况”代码不匹配?我还可以找到一些关于 window.open() 对 JavaScript 施加的限制的信息,因为它是在单独的窗口中打开的。 google.com/chrome/intl/en/webmasters-faq.html#newtab 那么有没有办法强制新标签作为一个孩子呢?
    • 此外,此行为在版本 5.0.307.11 中不存在。
    • @sonofdelphi:正如文章所述,如果我理解正确的话,只要您不给新标签页提供不同的域、端口或协议,新标签页就会以孩子的身份打开.对不起,我不知道测试这个的方法。不过,您最初的错误是由于code.google.com/p/chromium/issues/detail?id=37417
    • 感谢马塞尔的链接。看来chrome团队会恢复功能。
    【解决方案2】:

    这是我认为的解释

    http://groups.google.com/group/chromium-dev/browse_thread/thread/9844b1823037d297?pli=1

    您是否正在访问来自其他域的任何数据?不确定,但这可能会导致此问题。

    【讨论】:

    • 我正在使用 file:// 协议。源是本地 HTML 页面文件://memonaut.html。打开的新选项卡打开为“about:blank”。在其他浏览器中,将继承以前的文件名。即,在 IE、Firefox 等中,新标签的地址栏显示 file://memonaut.html 本身
    • 同样的错误信息,但这与跨域 XHR 无关。
    【解决方案3】:

    另一种选择是 data: 协议 URL。

    https://developer.mozilla.org/en/data_URIs

    http://msdn.microsoft.com/en-us/library/cc848897%28VS.85%29.aspx

    var durl = "data:text/html," + encodeURIComponent(text);
    var target = window.open(durl);
    

    在除 IE7 及以下的所有现代浏览器中均受支持。

    【讨论】:

    • 在 Chromium 中对我不起作用,不通过 file:// 协议使用本地文件,不使用 localhost/foo(在 Firefox 中按预期工作,尽管该浏览器的弹出窗口阻止程序开始抱怨,在使用 OP 显示的代码时没有)。
    【解决方案4】:

    您也可以尝试使用此代码关闭自己的选项卡/窗口,

    最初我在一段时间前制作了这个小的 greasemonkey 脚本以关闭 糟糕的弹出窗口和广告窗口,它运作良好(虽然不太出色)......

    //window.addEventListener("load", function () {
    window.addEventListener("onbeforeunload", function () {
        try {
            // clear inner html content to prevent malicious JS overrides. 
            document.getElementsByTagName("html")[0].innerHTML = "";
    
            window.open("javascript:window.close();", "_self", "");
            window.open("javascript:window.close();", "_self", "");
        }
        catch (e) {}
    }(), false);

    【讨论】:

      猜你喜欢
      • 2012-06-17
      • 2020-09-02
      • 2011-02-03
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2019-09-04
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多