ajax弹窗被拦截的几种解决方法
概述
有很多时候需要先调用ajax,ajax成功后弹出窗体。目前浏览器大多默认拦截弹窗,如果是用户操作(比如点击按钮)触发的弹框,浏览器不会拦截,但是不是用户触发的会拦截(一切都是为了用户体验)。
比较明显的是safari浏览器,点击按钮,先调用ajax,在ajax完成后,弹窗会被拦截。
解决方法
方法一:ajax改成同步
缺点:会堵塞ui,比如ajax调之前,显示loading,loading是显示不出来的
方法二:ajax调用前先弹窗(空地址),ajax之后,修改弹窗地址
缺点:ajax未返回前,窗口也存在。应用场景不广,比如ajax返回后需要调用第三方的方法,第三方方法中会弹窗,这个就没法处理。
方法三:设定1个定时器,在ajax的返回后,在定时器中弹窗
缺点:需要自行控制逻辑,容易漏场景
样例代码
var url = 'https://test.com'; //需要换成你的ajax var timeout = 3000; function getRequestData() { var request = { 'head': {} } return JSON.stringify(request) } $('#btn').click(function () { fun2(); }) //ajax同步 function fun1() { $.support.cors = true; $('#loading').show() $.ajax({ url: url, timeout: timeout, type: 'post', dataType: 'json', data: getRequestData(), cache: false, async: false, success: function (response, requestData) { //成功 console.log('success') $('#loading').hide() window.open('https://www.baidu.com', 'newwindow', 'height=100, width=400, top=400, left=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no') }, error: function (xhr, status, err, requestData) { //成功 console.log('error') $('#loading').hide() } }); } //先打开窗口,ajax返回后修改窗口 function fun2() { $.support.cors = true; $('#loading').show() var winHd = window.open('', 'newwindow', 'height=100, width=400, top=400, left=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no') $.ajax({ url: url, timeout: timeout, type: 'post', dataType: 'json', data: getRequestData(), cache: false, async: true, success: function (response, requestData) { //成功 console.log('success') $('#loading').hide() winHd.location = 'https://www.baidu.com' }, error: function (xhr, status, err, requestData) { //成功 console.log('error') $('#loading').hide() //关闭窗口 winHd.close() } }); } //定时器轮询 function fun3() { $.support.cors = true; $('#loading').show() var ajaxRet = null $.ajax({ url: url, timeout: timeout, type: 'post', dataType: 'json', data: getRequestData(), cache: false, async: true, success: function (response, requestData) { //成功 console.log('success') $('#loading').hide() ajaxRet = { 'code': 'success' } }, error: function (xhr, status, err, requestData) { //成功 console.log('error') $('#loading').hide() ajaxRet = { 'code': 'error' } } }); // var inter = setInterval(function () { if (ajaxRet) { if (ajaxRet.code === 'success') { window.open('https://www.baidu.com', 'newwindow', 'height=100, width=400, top=400, left=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no') } else { console.log('not success') } clearInterval(inter); } }, 100) }