JQuery 重新获得对外部弹出窗口的控制

Posted

技术标签:

【中文标题】JQuery 重新获得对外部弹出窗口的控制【英文标题】:JQuery Regaining control over a external pop-up 【发布时间】:2020-04-26 10:30:39 【问题描述】:

作为支付过程的一部分,我必须通过调用一个表单打开一个 twitter-bootstrap 模式,然后这个表单会打开一个外部窗口来启动该过程,银行渠道会引导用户输入他们的数据并进行购买。

我遇到的问题是我的页面被隐藏了,我无法恢复对进程的控制,因为通道窗口正在执行

window.close();

command (我无法更改或将其放在上面),所以当我更改初始时

window.open("", "payment_method_page", "width=8, height=6");

对于模式,尽管我可以在内部看到付款成功或发生了一些失败,但频道页面仍处于等待状态并徘徊。与此同时,应用程序已暂停。

我已经试过了:

$('#paymentModal').modal('hide');

和:

setTimeout(function()
    $('#paymentModal').modal('hide')
, 10000);

甚至:

$('#paymentModal').on('click', 'a', function(event) event.preventDefault(); window.open("", "payment_method_page", "width=800, height=600"););

,认为因为我的模态启动了我可以强制关闭的过程;但是外部窗口对此命令无动于衷。

如何通过 JQuery 强制关闭第三方窗口?

Javascript 初始操作

$(document).ready(function() 
      $('#payment_button_id_copy').val(#@order.payments.first.payment_button["codigoMedioPago"])
      $('#payment_frequency_copy').val("#@order.payments.first.payment_frequency")
      //window.open("", "payment_method_page", "width=800, height=600"); 
      $('#paymentModal').modal('show');     
      $('#params_form').submit();
    );

Params_Form

.hide
  = simple_form_for @order, url: main_app.payment_jump_path, html:  id: 'params_form', data: target: "#paymentModal", toggle: "modal" do
    - @order.available_payment_methods.each do |method|
      = hidden_field_tag "order[payments_attributes][][payment_method_id]", method.id, id: "payment_method_id_copy"
    = hidden_field_tag "order[payments_attributes][][payment_button_id]", nil, id: "payment_button_id_copy"
    = hidden_field_tag "order[payments_attributes][][payment_frequency]", nil, id: "payment_frequency_copy"
    button.submit-btn data-target="#paymentModal" data-toggle="modal" type="submit"

等待外部窗口关闭的Javascript

 $(document).ready(function(event)
    start_at = +new Date();
    $.poll(10000, function(retry)
      $.get('/payments/check.json', function(response, status)
        if (response['completed'] == true) 
          $('#paymentModal').modal('hide');
          $('.payment-message-waiting').hide();
          $('.payment-message-success').removeClass('hide');
          $('form#checkout_form_payment_button').submit();
         else 
          if (response['failed'] == true) 
            $('.payment-message-waiting').hide();
            $('.payment-message-error').removeClass('hide')
           else 
            retry_at = +new Date();

            delta = retry_at-start_at

            // 5 min => 300000 miliseconds => 5 * 60 * 1000
            if ( delta > 300000 )
              window.location = '/content/session-expired';
             else 
              retry();
            
          
        
      )
    )

    $.poll(5000, function(retry) 
      $.get('/payments/check_payment_presence.js', function(response, status)
        var payment_info = document.getElementById('payment-info').hasChildNodes();
        if(!payment_info) 
          retry();
        
      )
    )
  );

【问题讨论】:

仔细阅读支付网关通知。您会发现它有一个“响应 URL”,它会在其中为每个已处理的付款(包括失败的付款)发送响应请求。您还会发现响应结构有据可查。您需要做的是设置您的服务器(后端)以处理来自支付网关的所有请求。但他们两个是完全不同的(分离的)过程。您可能希望使用一个数据库来存储所有网关请求(当用户离开时),并在通过响应 URL 从网关获得结果后完成它们。 请注意,来自网关的请求不是用户旅程的一部分。用户结束付款后,可以在您的服务器上返回到“谢谢”页面,但这与响应 URL 无关,响应 URL 可能会在几分钟后出现(某些支付网关最多需要 30 分钟来处理付款)。另请注意,随着请求状态的变化,您可能会为每个付款请求收到多个响应。所有网关都很好地记录了这一点。最后但并非最不重要的一点是,不要使用Stack Overflow 获取有关付款做法的建议。唯一的权限是网关的技术人员。 【参考方案1】:

我实施的解决方案(感谢@hermes_sandoval 的帮助)是强制另一个页面在模式内的 iframe 中打开,这样如果服务需要很长时间才能处理,我的用户始终可以控制。

javascript:
  $(document).ready(function() 
    $('#payment_button_id_copy').val(#@order.payments.first.payment_button["codigoMedioPago"])
    $('#payment_frequency_copy').val("#@order.payments.first.payment_frequency")
    $('#iframeRedirect').html('');
    var iframe = "<iframe name='payment_method_page'  style='height: 660px;'/>";
    $('#iframeRedirect').append(iframe);
    $('#paymentModal').modal('show');
    $('#params_form').submit();
  );

【讨论】:

以上是关于JQuery 重新获得对外部弹出窗口的控制的主要内容,如果未能解决你的问题,请参考以下文章

Jquery 移动弹出窗口在页面调整大小或滚动时的错误位置重新打开

使用 jQuery 的具有复杂功能的弹出窗口

html Kore360雷克萨斯站点主页弹出模式窗口与样式。重新调整外部链接模式通知。

尝试通过单击打开它的 div 中断按钮外部来关闭弹出窗口

在 jquery 中刷新 ui-Dialog 弹出窗口

关闭jQUERY中的弹出窗口后如何刷新父页面? [复制]