Проблема, связанная с window.open () в Safari - PullRequest
1 голос
/ 31 марта 2020

Я знаю, что Safari пытается заблокировать открытие новой вкладки с помощью window.open () во время вызова ajax. Нам нужно вызвать window.open (), чтобы открыть новую вкладку перед вызовом ajax, чтобы программа могла предотвратить блокировку из Safari. Ссылка для выше, window.open (url, '_blank'); не работает в iMac / Safari .

Однако, что если я захочу использовать информацию из вызова ajax, чтобы проверить, нужно ли мне открывать новую вкладку, то есть условно открыть новую вкладку, зависит от проверка ajax вызова?

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

Как я могу сделать так, чтобы я мог открыть новую вкладку, если информация проверена из вызова ajax? Спасибо всем за ответы!

let newTab = window.open();

someAjaxChecking(...).then((isValid)=>{

   // isValid is a return boolean from the ajax calling someAjaxChecking() to 
   // determine whether redirect the new tab or close it

   if(isValid){
     newTab.location = url;
   }else{
     newTab.close(); // ***it is not desire to open and close the new tab...
   }

})

Реальный случай:

  • Мне нужно отправить форму (набор данных) на мой backbend, чтобы проверить форму (AJAX) Вызов);
  • тогда он вернет логическое значение (isValid), чтобы сказать, является ли форма действительной;
  • тогда откроет новую вкладку, если логическое значение (isValid) истинно

1 Ответ

1 голос
/ 31 марта 2020

Если я понимаю, что происходит на вашем сайте с точки зрения пользователя, это:

  • Пользователь предпринимает действия (например, нажимает кнопку)
  • Вы выполняете асинхронную c AJAX call
  • В случае успеха (обратный вызов) открывается новое окно

Теперь вы не можете выполнить третий шаг, потому что браузер не позволяет вам.

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


Решение может быть следующим:

  • выполните вызов AJAX, как только у вас есть данные для проверки
  • обратный вызов AJAX сохраняет результат (успех или неуспешность). В случае успеха включите / отобразите кнопку для открытия нового окна
  • нажатие кнопки (включено) запускает функцию, открывающую новое окно

Другое решение:

  • пользователь вводит данные
  • пользователь нажимает кнопку
  • выполняет AJAX вызов синхронно
  • , если проверка прошла успешно, затем откройте новое окно
...