Проблемы с блокировкой всплывающих окон (этого не должно происходить?) - PullRequest
2 голосов
/ 24 января 2012

Сначала уточним, я пытаюсь открыть всплывающее окно в ответ на пользовательское событие.

Я занимаюсь разработкой приложения для Facebook, которое включает транзакции электронной торговли, и по причинам, связанным с моими сертификатами EV SSL, я должен открыть наш платежный терминал в новом, полностью защищенном окне. Таким образом, процесс идет следующим образом:

  1. Пользователь выбирает «новую карту» в качестве способа оплаты и вводит адрес доставки получателя
  2. Пользователь нажимает «Разместить заказ», который использует вызов AJAX для проверки адреса, и, если он действителен, синхронизирует его с базой данных.
  3. Если адрес действителен (AJAX success: function ()), и пользователь выбрал «новую карту», ​​то терминал защищенного биллинга должен открываться с помощью вызова window.open.

Насколько я понимаю, большинство современных браузеров, включая Chrome, Firefox и Safari, должны проходить по цепочке, чтобы определить, было ли исходное событие инициировано пользователем (в данном случае это было событие щелчка), однако несмотря на это, я не могу предотвратить блокировку этого всплывающего окна, и у моих пользователей возникают большие проблемы с выяснением того, что происходит.

К сожалению, Chrome не делает все это заметным, когда всплывающее окно блокируется, поэтому большинство пользователей этого не заметят и предположат, что приложение просто «сломано».

Есть идеи? Мы через неделю после запуска, и я отчаялся ...

[РЕДАКТИРОВАТЬ] Вот код для справки:

/* -- Step 3: Complete Checkout Click -- */

$('div.finishGroupOrder').live('click', function() {

    /* User is Click-Happy? */

    if ( $('div#billing-contents div#loader').length ) {

        alert('Your order is processing.  We know it\'s hard, but please be patient.');
        return false;

    }       

    var paymentMethod   = $('input[name="method"]:checked').val();                      // Payment Method Selected ( Card on File / New / PayPal )

    var secureSession   = $(this).attr('secure');                                   // Secure Session ID

    var orderData       = { addressSelection: $('input[name="address"]:checked').val(),
                        price: $('div.price').attr('value')  };

    /* Form Validation */

    switch( orderData.addressSelection ) {

        case 'new': // User chose to enter address manually

            var allInputs = $('div#new-address').find('input:not(#address2), select');
            var validInputs = $('div#new-address').find('input[value!=""]:not(#address2), select[value!=""]');

            if ( allInputs.length === validInputs.length ) {                            // All inputs are valid, capture their contents

                allInputs.removeClass('bad-value');

                var address = {   phone: $('input#phone').val(),
                               address1: $('input#address1').val(),
                               address2: $('input#address2').val(),
                               city: $('input#city').val(),
                               state: $('select#state').val(),
                               zip: $('input#zipcode').val()  };

                var validatedAddress = validation.validateAddress(address);

                if (validatedAddress) {

                    address.address1    = validatedAddress.address1;
                    address.address2    = validatedAddress.address2;
                    address.city        = validatedAddress.city;
                    address.state       = validatedAddress.state;
                    address.timeOffset  = validatedAddress.timeOffset;              // Time offset from EST (PST = -3, EST = 0, etc.)

                    $('input#timezone').val(address.timeOffset);

                } else {

                    allInputs.addClass('bad-value');
                    return false;

                }

            } else {                                                            // Some inputs are invalid, prompt the user to fix them

                allInputs.filter(function() { return ($.inArray( this, validInputs ) > -1) ? false : true; }).addClass('bad-value');
                return false;

            }

            break;

        case 'verified':    // User chose to ship to verified address

            var address = {   address1: 'verified'  };

            break;

        default:

            alert('Please choose an address where you want the flowers to be delivered.');
            return false;

            break;

    }


    /* Sync Order With Updated Address Information */

    $.ajax({    type: 'POST',
            url: location.protocol + '//' + location.host + '/_ajax/order.ajax.php',
            data: 'action=update_order&' + $.param( address ),

            success: function() {

                /* Load Selected Payment Method */

                switch( paymentMethod ) {

                    //case 'paypal': paypal(); break;

                    case 'member':
                        newGroupOrderDialogActions.payAsMember();
                        break;

                    case 'newCard':
                        newGroupOrderDialogActions.payWithCard( secureSession );
                        //$('div.group-secure-terminal').trigger('click');
                        break;

                }

            }
    });

И newGroupOrderActions.payWithCard () ...

/* -- Pay With a New Credit Card -- */

                                payWithCard: function( session ) {

                                    var windowHeight = 769;         // Terminal Height
                                    var windowWidth = 638;          // Terminal Width
                                    var w = screen.availWidth;      // Available Screen (W)
                                    var h = screen.availHeight;     // Available Screen (H)
                                    var top = (h-windowHeight)/2;       // Center Positioning
                                    var left = (w-windowWidth)/2;       // Center Positioning


                                    /* Open Secure Order Terminal */

                                    var secureTerminal = window.open('https://secure.mydomain.ly/contribute?id=' + session, 'myCompany: Secure Checkout', 'menubar=0,toolbar=0,location=1,resizable=0,scrollbars=1,height='+windowHeight+',width='+windowWidth+',top='+top+',left='+left);


                                    /* Check for Secure Order Terminal Close Event */

                                    var onFinish = setInterval(function() {

                                        try {
                                            if (secureTerminal.closed) {                                                                    // Window has been unloaded, check the order to see if it has been approved

                                                clearTimeout(onFinish);

                                                $.ajax({    type: 'POST',
                                                        url: location.protocol + '//' + location.host + '/_ajax/redirect.ajax.php',
                                                        data: 'action=group_order_status_redirect',
                                                        success: function(redirect) { newGroupOrderDialogActions.publishOrder( redirect ) }         // If redirect is not null, order was successful.  Redirect to order page   
                                                });
                                            }
                                        } catch (e) {}

                                    }, 200);

                                },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...