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

Javascript JQuery重新获得对外部弹出窗口的控制,javascript,jquery,ruby-on-rails,twitter-bootstrap,slim-lang,Javascript,Jquery,Ruby On Rails,Twitter Bootstrap,Slim Lang,作为支付流程的一部分,我必须通过调用表单打开twitter引导模式,该表单反过来打开一个外部窗口,以启动流程,银行渠道引导用户输入数据并进行购买 我遇到的问题是,我的页面被隐藏,我无法恢复对进程的控制,因为通道窗口正在执行 window.close(); 命令(我不能更改或把手放在上面),所以当我更改了初始值时 window.open("", "payment_method_page", "width=8, height=6"); 对于一个模式,频道页面仍在等待和徘徊,尽管事实上,在内部我可

作为支付流程的一部分,我必须通过调用表单打开twitter引导模式,该表单反过来打开一个外部窗口,以启动流程,银行渠道引导用户输入数据并进行购买

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

window.close();
命令(我不能更改或把手放在上面),所以当我更改了初始值时

window.open("", "payment_method_page", "width=8, height=6");
对于一个模式,频道页面仍在等待和徘徊,尽管事实上,在内部我可以看到付款是成功的或有一些失败。同时,应用程序暂停

我已经试过了:

$('#paymentModal').modal('hide');
以及:

甚至:

$('#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();
    });
参数表

.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();
        }
      })
    })
  });

我实现的解决方案(感谢@hermes_sandoval的帮助)是强制另一个页面在modal内的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();
  });
javascript:
$(文档).ready(函数(){
$(“#付款按钮_id_copy”).val(#{@order.payments.first.payment_按钮[“codigoMedioPago”]})
$(“#付款频率(副本)”).val(“#{@order.payments.first.payment(频率)”)
$('#iframeRedirect').html('');
var-iframe=“”;
$('#iframeRedirect')。追加(iframe);
$('paymentModal').modal('show');
$('params_form')。提交();
});

仔细阅读支付网关通知。您会发现它有一个“响应URL”,在该URL上,它为每个已处理的付款(包括失败的付款)发送响应请求。您还将发现响应结构有很好的文档记录。您需要做的是设置服务器(后端)以处理来自支付网关的所有请求。但这两个过程是完全不同的。您可能希望使用一个数据库,在其中存储所有网关请求(当用户离开时),并在从网关获得结果后通过响应URL完成这些请求。请注意,来自网关的请求不是用户旅程的一部分。用户结束付款后,可以在您的服务器上返回到“谢谢”页面,但这与响应URL无关,响应URL可能会在几分钟后出现(一些支付网关处理付款最多需要30分钟)。还请注意,随着请求状态的更改,每个付款请求可能会得到多个响应。所有网关都很好地记录了这一点。最后,但并非最不重要的一点是,不要在支付实践中使用建议。唯一的权威是网关的技术人员。
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();
  });