弹出窗口阻塞的问题(这不应该发生?)

时间:2012-01-23 21:29:34

标签: javascript google-chrome popup popup-blocker

首先澄清,我尝试打开弹出窗口以响应用户事件。

我正在开发一个涉及电子商务交易的Facebook应用程序,并且出于与我的EV SSL证书相关的原因,我必须在一个全新的,完全安全的窗口中打开我们的计费终端。因此,该过程如下:

  1. 用户选择“新卡”作为付款方式并输入收件人的送货地址
  2. 用户点击“下订单”,它使用AJAX调用来验证地址,如果有效,则将其与数据库同步。
  3. IF地址有效(AJAX成功:function()),用户选择“新卡”,则安全计费终端应该使用window.open调用打开。
  4. 据我了解,大多数现代浏览器(包括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);
    
                                    },
    

0 个答案:

没有答案