window.open在Safari中的问题

参考页面

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);
        });
}

你可能感兴趣的:(window.open在Safari中的问题)