safari中没办法在回调函数里面执行window.open, 原因是safari的安全机制将其阻挡了。
如果你有这样的需求(或者类似的),通过ajax 发送请求到服务器端,等待请求响应成功之后,根据从服务器端响应得到的数据,打开一个窗口显示给用户,在safari上是没办法直接一个window.open搞定的。
那么window.open 在safari中只有当用户触发事件之后才能被调用成功的,怎么解决这个问题呢? 很简单,绕过这个该死的安全机制,在你调用ajax请求之前,打开这个窗口, 然后在回调函数里面修改新打开窗口的location, 这样就解决了。
function download() {
// 由于mac操作系统中safari的安全机制限制,在视频下载时要有不同的处理
if (navigator.platform.indexOf('Mac') > -1 && navigator.userAgent.indexOf('Safari') > -1 && navigator.userAgent.indexOf('Chrome') < 0 ) {
// Mac操作系统下的safari浏览器在ajax的回调函数中,执行window.open()函数不会起作用,所以要绕开在ajax中调用的方式
const winRef = window.open('', 'download_' );
_doDownload(videoRecordingId, datas => {
winRef.location = datas.data.downloadUrl;
});
} else {
_doDownload(videoRecordingId, datas => {
window.open(datas.data.downloadUrl, 'download_' );
});
}
}
function _doDownload(callback) {
$.ajax({
url: ...,
type: 'GET'
}).done((datas) => {
if (callback && typeof callback === 'function') {
callback(datas);
} else {}
}).fail((err) => {
console.dir(err);
});
}
网友评论