我需要在新窗口中打开外部链接。我在视图中点击编辑按钮:
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新窗口似乎被阻止了?在我的案例中有解决方法吗?
答案 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();
});