【问题标题】:Open a browser tab from chrome-app, with access to localStorage从 chrome-app 打开浏览器选项卡,并访问 localStorage
【发布时间】:2013-11-19 08:21:10
【问题描述】:

我正在尝试从我的 chrome 应用程序中打开常规浏览器选项卡。 我希望打开标签,无需在它们之间进行通信。 到目前为止,我已经尝试了以下两种创建和加载新标签的方法。

var a =  document.createElement('a')
a.href = "https://example.com";
a.target = "_blank";
a.click();

var w = window.open(s.Url, "_blank");
w.focus();

再尝试一次,结果相同。这个被硬编码到 html 中,并由用户单击它来激活。所以问题与javascript本身无关,而与chrome处理外部链接的方式有关。

<a href="https://example.com/" target="_blank">Open external website</a>

但是,在这些创建的选项卡中,localStorage 为空。 显然,该选项卡在某些应用程序环境中仍处于打开状态。 如果我复制 URL 并将其粘贴到新选项卡中,则 localStorage 可用。

如何打开类似于用户复制/粘贴 url 的新浏览器选项卡。

更新 该应用程序是使用 window.open 从后台页面启动的,以创建选项卡而不是新窗口。如果使用了 chrome.app.window.create,链接会在浏览器中正确打开且 localStorage 可用。

【问题讨论】:

    标签: javascript local-storage google-chrome-app


    【解决方案1】:

    从症状来看,您是从后台(事件)页面执行此操作的。 window.open() 当前从后台页面调用时非常错误。有一个bug 和一个proposal 用于解决这个问题的API。在此期间您可以执行以下操作:

    1. 在您使用 document.createElement('a') 的解决方案中,您在错误的文档中创建了您的元素(根据上述错误,“错误”)。那是背景页面窗口的文档,您应该使用内容窗口之一。将创建元素的方式更改为:

      var a = win.contentWindow.document.createElement('a');

      其中win是chrome.app.window.create回调中返回的应用窗口对象。这应该可以。

    2. 您无法在后台页面中修复 window.open(),但请参阅下面的 #3。

    3. 或者,如果可能的话,您可以将 2 个解决方案中的任何一个原封不动地移动到从 .html 调用的脚本中:

    ma​​in.html

    <html>
      <body>
        ...
        <script src="main.js"></script>
      </body>
    </html>
    

    ma​​in.js

    function SomeEventHandler() {
      // This...
      var a = document.createElement('a')
      a.href = "https://example.com";
      a.target = "_blank";
      a.click();
    
      // ... or this will both work.
      window.open("https://example.com");
    }
    

    【讨论】:

    • 它不是一个背景页面,而是一个可见的 chrome-app 选项卡,它在某种程度上是孤立的。前面的代码示例不是在 chrome.app.window 中运行,而是在使用 window.open 从后台页面创建的选项卡中运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2017-03-19
    • 1970-01-01
    • 2013-04-24
    • 2011-07-28
    • 2016-10-18
    相关资源
    最近更新 更多