Safari window.open()不起作用

时间:2016-11-01 14:26:53

标签: javascript safari window.open

我需要在新窗口中打开外部链接。我在视图中点击编辑按钮:

module.exports = utils.Backbone.View.extend({
    events: {
        "click #edit": "onEditClicked"
    },

    "onEditClicked": () => PubSub.publish("EDITOR_REQUESTED");
});

然后我检查用户是否已登录。 如果是 - 我发送通知" OPEN_EDITOR"并希望通过外部链接打开一个新窗口。

TextEditorController.prototype.handleMessages = function () {

    PubSub.subscribe("OPEN_EDITOR", () => {
        var editor = window.open(this.$service.getEditorURL());
    });
});

但在Safari新窗口似乎被阻止了?在我的案例中有解决方法吗?

2 个答案:

答案 0 :(得分:3)

它的原因是Safari的内置弹出窗口拦截器。

允许在Safari中打开新窗口的唯一javascript是javascript直接附加到用户的事件。在你的情况下,你稍后会调用window.open。

此处的解决方法可以是:

  • 在onEditClicked方法中创建一个没有URL的窗口

    safariWindow = window.open();

  • 在handleMessages函数中更改该窗口的URL

    safariWindow.location.href = newUrl

答案 1 :(得分:0)

如果要在Safari浏览器中打开一个弹出窗口,则需要遵循以下代码。 在从后端获取URL之前,请打开弹出窗口。

const width = 500;
const height = 600;
const top = window.innerHeight / 2 - height / 2;
const left = window.innerWidth / 2 - width / 2;
const params = `modal=yes, toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${width}, height=${height}, top=${top}, left=${left}`;
if (oauthPopup === null || oauthPopup.closed) {
  console.log(oauthPopup);
  oauthPopup = window.open("", "", params);
}

从后端获取URL后,更改弹出窗口的位置。

await request()
  .get(`/sources/authorizationEndpoint`, {
    headers: {
      authorizer: token,
    },
  })
  .then((response) => {
    const url = response.data.oauth_url;
    oauthPopup.location = url;
    oauthPopup.focus();       
  })
  .catch((err) => {
    oauthPopup.close();
  });