Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果有延迟,onclick处理程序中会触发弹出窗口阻止程序_Javascript_Jquery_Google Chrome_Popup_Popup Blocker - Fatal编程技术网

Javascript 如果有延迟,onclick处理程序中会触发弹出窗口阻止程序

Javascript 如果有延迟,onclick处理程序中会触发弹出窗口阻止程序,javascript,jquery,google-chrome,popup,popup-blocker,Javascript,Jquery,Google Chrome,Popup,Popup Blocker,在实现支付网关时,我遇到了这样一种情况:用户体验最好使用弹出窗口进行3D安全处理 流程如下: 用户位于付款页面上,并将信用卡数据输入托管字段 在“Buy”onclick事件中,我调用网关的javascript片段来获取卡令牌 我把它贴到后端 后端将检查是否需要3DS 如果是,前端将使用3DS窗体打开一个新窗口 onclick的代码如下所示: var win; $("#buy").click(function() { gateway.Tokenize(functio

在实现支付网关时,我遇到了这样一种情况:用户体验最好使用弹出窗口进行3D安全处理

流程如下:

  • 用户位于付款页面上,并将信用卡数据输入托管字段
  • 在“Buy”onclick事件中,我调用网关的javascript片段来获取卡令牌
  • 我把它贴到后端
  • 后端将检查是否需要3DS
  • 如果是,前端将使用3DS窗体打开一个新窗口
  • onclick的代码如下所示:

    var win;
    
    $("#buy").click(function() {
    
        gateway.Tokenize(function(token) {
    
            $.ajax({
                url: 'backend.php',
                type: "POST",
                data: {
                    token: token
                }
            }).done(function(data) {
    
                if (data.threeDRequired) {
                    win = window.open(data.url, "_blank");
                    win.focus();
                }
    
            });
    
        });
    
    });
    
    通常情况下,这没有问题,弹出窗口会打开,但是如果
    Tokenize
    方法或
    $.ajax
    调用花费的时间太长,弹出窗口阻止程序会被触发。甚至将
    async:false
    添加到
    $.ajax
    调用也没有帮助

    在任何情况下,我都能做些什么来让它起作用吗?目前我能想到的唯一解决方案是在单击事件开始时打开一个弹出窗口,然后在可用时加载URL,或者在弹出窗口被阻止时让用户单击其他按钮。
    两者似乎都不理想。

    事件是同步的,并且会立即过期,这意味着您无法捕获单击并在将来的任何时候使用它的特权/权限

    您可以做的是,立即打开弹出窗口,并在
    标记化
    返回后关闭或更新其位置

    这是一个乐观的方法,但是如果你确信成功是最令人期待的行为,那么它不应该太烦人

    var win;
    $("#buy").click(function() {
      win = window.open("about:blank", "_blank");
      gateway.Tokenize(function(token) {
        $.ajax({
          url: 'backend.php',
          type: "POST",
          data: {token: token}
        }).done(function(data) {
          if (data.threeDRequired) {
            win.location = data.url;
            win.focus();
          }
          else {
            win.close();
          }
        });
      });
    });
    
    这应该能奏效