美文网首页
window.open在Safari中的问题

window.open在Safari中的问题

作者: BigDipper | 来源:发表于2018-03-29 16:26 被阅读38次

    参考页面

    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中的问题

          本文链接:https://www.haomeiwen.com/subject/kjamcftx.html