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

  

 

posted @ 2020-07-24 10:01  feiniao0822  阅读(896)  评论(0)    收藏  举报