Триггер window.open как ajax завершен - PullRequest
0 голосов
/ 10 ноября 2018

На веб-сайте есть некоторые jQuery-вызовы ajax, в некоторых из них в случае успеха запускается winwdow.open в другом домене. Я владею другими доменами сайтов.

Например:

  1. site https://site1.example.com сделай на ajax вызов сам на себя
  2. в случае успеха вызвать window.open на https://site1.example2.com или https://site2.example.com
  3. часто блокировщик всплывающих окон блокирует операцию

Как я могу решить эту проблему? Нужно ли включать CORS на моем сайте / сервере https://enable -cors.org / ?

Код (конечно, я не владею Google):

$.ajax({
    url:'/echo/js/?js=hello%20world!',
    complete: function (response) {
        $('#output').html(response.responseText);
        window.open('https://www.google.com');
    },
    error: function () {
        $('#output').html('Bummer: there was an error!');
    },
});

Демо: https://jsfiddle.net/IrvinDominin/nbsu3hgk/

Ответы [ 2 ]

0 голосов
/ 17 января 2019

У меня недавно была такая же проблема, как и у вас. В моем случае мне нужно было выполнить некоторые операции перед открытием новой страницы. Я потребовал открытия новой страницы для тега привязки и использовал метод предотвращение открытия, когда операции возвращали отрицательный результат.

<a href="https://www.google.com" targe="_blank" onclick="doSomeOperation(event)">text</a>  

<script>
function doSomeOperation(event){
$.ajax({
    async:false,
    url:'/echo/js/?js=hello%20world!',
    complete: function (response) {
        $('#output').html(response.responseText);
    },
    error: function () {
        event.preventDefault();
        $('#output').html('Bummer: there was an error!');
    },
});
}
</script>
0 голосов
/ 10 ноября 2018

Поскольку window.open требует прямого действия пользователя (например, щелчка), чтобы избежать блокировщиков всплывающих окон, вы можете изменить свой код следующим образом:

$.ajax({
    url:'/echo/js/?js=hello%20world!',
    complete: function (response) {
        $('#output').html(response.responseText);
        //window.open('https://www.google.com');
        $( "body" ).append('<button id="openPopup">Open Site</button>');
        $( "#openPopup" ).click( function() { 
                window.open('https://www.google.com');
        });
    },
    error: function () {
        $('#output').html('Bummer: there was an error!');
    },
});

Если запрос ajax выполнен успешно, пользователям отображается кнопка, которую они должны нажать, чтобы перейти в другой домен.

Редактировать: Ссылаясь на ваш комментарий ниже, я думаю, что нашел решение:

var myPopup;
$( document ).on("click", "#myButton", function() {
    myPopup = window.open("/");

    $.ajax({
        url:'/echo/js/?js=hello%20world!',
        complete: function (response) {
            $('#output').html(response.responseText);
            //window.open('https://www.google.com');
            myPopup.location.href = 'https://www.google.com';
        },
        error: function () {
            $('#output').html('Bummer: there was an error!');
        },
    });
});

Сначала вы должны объявить глобальную переменную для вашего нового окна. Когда нажимается ваша кнопка, которая запускает запрос ajax, вы открываете новое окно, которое ссылается на ваш текущий домен (https://site1.example.com/ в вашем случае). Это принимается как прямое действие пользователя, поэтому блокировщик всплывающих окон не вступает в силу.

В функции complete вы перенаправляете это окно в один из других доменов (https://site1.example2.com или https://site2.example.com), и вуаля. Я протестировал его с активированным блокировщиком всплывающих окон, и он работал.

...