Window.open без блокировщика всплывающих окон с использованием AJAX и манипулирования окном.

При работе с OAuth с сервера, например Twitter и Facebook, вы, скорее всего, перенаправите пользователя на URL-адрес, запрашивающий разрешение на использование приложения. Обычно после нажатия ссылки вы отправляете запрос на сервер через AJAX, а затем возвращаете URL-адрес авторизации.

Но когда вы пытаетесь использовать window.open, когда ответ получен, ваш браузер блокирует всплывающее окно, делая его бесполезным. Конечно, вы можете просто перенаправить пользователя на новый URL-адрес, но это нарушает работу пользователя, а также раздражает. Вы не можете использовать IFRAMES, но они не разрешены (потому что вы не видите строку местоположения).

Итак, как это сделать?

Ответ 1

Ответ довольно прост и работает без браузера без каких-либо проблем. Выполняя вызов AJAX (я буду использовать jQuery в этом примере), просто выполните следующее. Предположим, что у нас есть форма с двумя кнопками Login with Twitter и Login with Facebook.

<button type="submit" class="login" value="facebook" name="type">Login with Facebook</button>
<button type="submit" class="login" value="twitter" name="type">Login with Twitter</button>

Затем код Javascript, где происходит волшебство

$(function () {
    var
        $login = $('.login'),
        authWindow;

    $login.on('click', function (e) {
        e.preventDefault();
        /* We pre-open the popup in the submit, since it was generated from a "click" event, so no popup block happens */
        authWindow = window.open('about:blank', '', 'left=20,top=20,width=400,height=300,toolbar=0,resizable=1');
        /* do the AJAX call requesting for the authorize URL */

        $.ajax({
            url: '/echo/json/',
            type: "POST",
            data: {"json": JSON.stringify({"url": 'http://' + e.target.value + '.com'})}
            /*Since it a jsfiddle, the echo is only for demo purposes */
        })
        .done(function (data) {
            /* This is where the magic happens, we simply redirec the popup to the new authorize URL that we received from the server */
            authWindow.location.replace(data.url);
        })
        .always(function () {
            /* You can poll if the window got closed here, and so a refresh on the main page, or another AJAX call for example */
        });
    });
});

Вот POC в JSFiddle http://jsfiddle.net/CNCgG/

Это просто и эффективно:)

Ответ 2

Попробуйте добавить async: false. Он должен работать

$('#myButton').click(function() {
$.ajax({
    type: 'POST',
    async: false,
    url: '/echo/json/',
    data: {'json': JSON.stringify({
        url:'http://google.com'})},
    success: function(data) {
        window.open(data.url,'_blank');
    }
});
});