Window.open() работает по-разному на успехе AJAX

Возможный дубликат:
window.open(url) другое поведение - тот же код, разные сроки

Мне будет легче объяснить проблему, если я просто покажу вам этот пример → http://jsfiddle.net/RU2SM/
Как вы можете видеть, есть две кнопки, одна называется "AJAX", а одна называется "Direct"... Итак, если вы нажмете "Direct", откроется окно (новая вкладка в Chrome), но если я попытаюсь сделать window.open( ) на обработчике успеха AJAX, он не работает одинаково.
Я уверен, что проблема в AJAX, но я понятия не имею, как это исправить.
Полюбутся любые хорошие идеи. Благодаря

Ответы

Ответ 1

Это работает как прелесть:

// Direct window.open()
$('#btnDirect').on('click',function(){
    window.open('http://google.com')
})
var success = false;  //NOTE THIS

// AJAX window.open()
$('#btnAJAX').on("click", function(){
    $.ajax({
      url: "/user/login/",
      context: document.body,
      async:false,   //NOTE THIS
      success: function(){  //THIS ALSO CHANGED
         success = true
      }
    });
    if(success){ //AND THIS CHANGED
      window.open('http://google.com')
    }
})

Что это значит, когда успех Ajax является успешным, он задает значение переменной true.
Функция async:false propperty гарантирует, что оператор if будет запущен после завершения вызова Ajax.
Таким образом, window.open запускается в тех же обстоятельствах, что и ваша прямая ссылка.

Ответ 2

Проблема заключается в том, что браузеры часто блокируют window.open, если они не вызваны в прямой реакции на действие пользователя. Вот почему ваш обработчик кликов работает (щелчок является действием пользователя), но ваш обработчик AJAX не делает.

Одним из решений является открытие окна во время первоначального действия щелчка, а затем обновление его местоположения по успеху AJAX (или его повторное завершение при сбое AJAX).

В противном случае вам придется заставить пользователя явно разрешать всплывающие окна из вашего домена в своем браузере.

Ответ 3

Лучший способ реализовать любую логику после успеха вызова ajax, происходит событие, срабатывающее при каждом выполнении ajax-вызова, т.е. $. ajax.Request.done и $. ajax.Request.fail. $. ajax.Request.done(function() {if (success) {//Реализация логики}});

Ответ 4

в качестве дополнения также стоит упомянуть, что использование async: false, а затем вызов window.open работает в chrome и firefox, но может вызвать проблемы с сафари... он даже не дает информации о том, что всплывающее окно было заблокировано