window.open блокируется хром [дубликат]

Попробуйте это

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}
114
задан Mark Amery 10 November 2015 в 15:24
поделиться

8 ответов

Общее правило заключается в том, что блокировщики всплывающих окон будут задействованы, если [j1] или подобное вызывается из javascript, который не вызывается прямым действием пользователя. То есть вы можете вызвать window.open в ответ на нажатие кнопки без попадания в блокировщик всплывающих окон, но если вы поместите тот же код в событие таймера, он будет заблокирован. Глубина цепочки вызовов также является фактором - некоторые старые браузеры смотрят только на непосредственного вызывающего абонента, новые браузеры могут немного отступить, чтобы увидеть, был ли вызывающий абонент щелчком мыши и т. Д. Держите его настолько мелким, насколько это возможно, чтобы избежать блокировщиков всплывающих окон.

221
ответ дан dthorpe 28 August 2018 в 00:31
поделиться

Кроме того, Swiss Mister post, в моем случае window.open был запущен внутри обещания, который включил блокировку всплывающих окон, мое решение было: в угловом:

$scope.gotClick = function(){

  var myNewTab = browserService.openNewTab();
  someService.getUrl().then(
    function(res){
        browserService.updateLocation(res.url, myNewTab);

    }
  );
};

browserService:

this.openNewTab = function(){
     var newTabWindow = $window.open();
     return newTabWindow;
}

this.updateTabLocation = function(tabLocation, tab) {
     if(!tabLocation){
       tab.close();
     }
     tab.location.href = tabLocation;
}

так вы можете открыть новую вкладку с помощью ответа на обещание и не вызвать блокировщик всплывающих окон.

14
ответ дан David 28 August 2018 в 00:31
поделиться

Как хорошая практика, я думаю, что это хорошая идея test , если всплывающее окно было заблокировано и принять меры в случае. Вы должны знать, что window.open имеет возвращаемое значение, и это значение может быть пустым, если действие не выполнено. Например, в следующем коде:

function pop(url,w,h) {
    n=window.open(url,'_blank','toolbar=0,location=0,directories=0,status=1,menubar=0,titlebar=0,scrollbars=1,resizable=1,width='+w+',height='+h);
    if(n==null) {
        return true;
    }
    return false;
}

, если всплывающее окно заблокировано, window.open вернет значение null. Таким образом, функция вернет false.

В качестве примера предположим, что вы вызываете эту функцию непосредственно из любой ссылки с target="_blank": если всплывающее окно успешно открыто, то возврат false блокирует действие ссылки , иначе, если всплывающее окно заблокировано, возврат true позволит по умолчанию (открыть новое окно _blank) и продолжить.

<a href="http://whatever.com" target="_blank" onclick='return pop("http://whatever.com",300,200);' >

Таким образом, у вас будет всплывающее окно, если оно работает, и окно _blank, если нет.

Если всплывающее окно не открывается, вы можете:

  • открыть пустое окно, как в пример и продолжить
  • открыть поддельное всплывающее окно (iframe внутри страницы)
  • сообщить пользователю («разрешить всплывающие окна для этого сайта»)
  • открыть пустое окно, а затем информировать пользователя и т. д.
12
ответ дан FrancescoMM 28 August 2018 в 00:31
поделиться

из API JavaScript oauth от Google:

http://code.google.com/p/google-api-javascript-client/wiki/Authentication

См. область, где она читается:

Настройка аутентификации

В реализации клиента OAuth 2.0 используется всплывающее окно, предлагающее пользователю выполнить вход и одобрить приложение. Первый вызов функции gapi.auth.authorize может вызывать блокировки всплывающих окон, поскольку он косвенно открывает всплывающее окно. Чтобы предотвратить блокирование блокировщика всплывающих окон при вызове auth, вызовите функцию gapi.auth.init (обратный вызов), когда клиент загружается. Приведенный обратный вызов будет выполнен, когда библиотека готова к авторизации вызовов.

Я бы предположил, что это связано с реальным ответом выше, как он объясняет, есть ли немедленный ответ, он не отключит всплывающее предупреждение. «Gapi.auth.init» делает это так, что api происходит немедленно.

Практическое применение

Я сделал микросервис с проверкой подлинности с открытым исходным кодом, используя паспорт узла на npm, и различные паспортные пакеты для каждого провайдера. Я использовал стандартный подход переадресации к третьей стороне, давая ему URL-адрес переадресации, чтобы вернуться. Это было программно, поэтому я мог бы иметь разные места для перенаправления обратно, если вход / регистрация и на определенные страницы.

github.com/sebringj/athu

passportjs.org

7
ответ дан Jason Sebring 28 August 2018 в 00:31
поделиться

На основе очень полезный совет Джейсона Себринга , а на материалах, покрытых здесь и , Я нашел идеальное решение для своего случая:

Псевдокод с фрагментами Javascript:

  1. сразу же создает пустое всплывающее окно по пользовательскому действию
    var importantStuff = window.open('', '_blank');
    
    Необязательно: добавьте некоторые «ожидания», информационное сообщение. Примеры: a) Внешняя страница HTML: замените указанную выше строку на
    var importantStuff = window.open('http://example.com/waiting.html', '_blank');
    
    b) Текст: добавьте следующую строку ниже:
    importantStuff.document.write('Loading preview...');
    
  2. заполнить ее контентом при готовности (когда AJAX вызов возвращен, например)
    importantStuff.location.href = 'http://shrib.com';
    

Обогатите вызов window.open с любыми дополнительными параметрами, которые вам нужны.

Я действительно использую это решение для mailto перенаправление, и он работает во всех моих браузерах (Windows 7, Android). Бит _blank помогает перенаправлять mailto для работы на мобильных устройствах.

Ваш опыт? Любой способ улучшить это?

121
ответ дан meagar 28 August 2018 в 00:31
поделиться

Я попробовал несколько решений, но его единственный, который действительно работал для меня во всех браузерах

let newTab = window.open(); newTab.location.href = url;

-1
ответ дан pomobc 28 August 2018 в 00:31
поделиться

Самый простой способ избавиться от этого - это очень хорошо работает -

  1. Не используйте document.open ().
  2. Вместо этого используйте этот документ. .location.href = location; где местоположение - загружаемый url

Пример:

<script>
function loadUrl(location)
{
this.document.location.href = location;
}</script>

<div onclick="loadUrl('company_page.jsp')">Abc</div>

Это работает очень хорошо. Приветствия

-4
ответ дан Pramod Shetty 28 August 2018 в 00:31
поделиться

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

function submitAndRedirect {
  apiCall.then(({ redirect }) => {
      const a = document.createElement('a');
      a.href = redirect;
      a.target = '_blank';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
  });
}
0
ответ дан user3479425 28 August 2018 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: