Заставить window.open () создать новую вкладку в Chrome

Я использую window.open для заполнения нового окна различным содержимым. В основном отчеты и сохраненный HTML из автоматизированных процессов.

Я заметил очень непоследовательное поведение Chrome в отношении window.open ().

Некоторые из моих вызовов создают новую вкладку (предпочтительное поведение), а некоторые вызывают всплывающие окна.

var w = window.open('','_new');
w.document.write(page_content);

page_content - это просто обычный HTML из вызовов AJAX. Отчеты содержат некоторую информацию в заголовке, такую ​​как заголовок, значок и некоторые таблицы стилей.

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

Я знаю, что некоторые люди скажут, что это поведение оставлено на усмотрение пользователя, но это внутренняя бизнес-платформа. У нас нет времени обучать всех пользователей тому, как управлять всплывающими окнами, и нам просто нужно, чтобы это было на новой вкладке. Черт возьми, даже новое окно было бы предпочтительнее всплывающего окна, поскольку вы не можете закрепить всплывающее окно в Chrome. Не говоря уже о том, что ни один код блокировки всплывающих окон не повлияет на это.

Цените любое понимание.


person user1441141    schedule 17.08.2012    source источник
comment
Выкидывать безумную идею: window.open('data:text/html,' + escape(page_content))? РЕДАКТИРОВАТЬ: только что попробовал, нет.   -  person ephemient    schedule 17.08.2012


Ответы (5)


window.open необходимо вызывать в обратном вызове, который запускается действием пользователя (например, onclick), чтобы страница открывалась в новой вкладке вместо окна.

Пример:

$("a.runReport").click(function(evt) {
    // open a popup within the click handler
    // this should open in a new tab
    var popup = window.open("about:blank", "myPopup");

    //do some ajax calls
    $.get("/run/the/report", function(result) {
        // now write to the popup
        popup.document.write(result.page_content);

        // or change the location
        // popup.location = 'someOtherPage.html';
    });
});
person Matt MacLean    schedule 31.01.2013
comment
блин, я подозревал, что это будет так (т.е. взаимодействие с пользователем / событие каким-то образом связано), спасибо - person Jaroslav Záruba; 18.02.2013
comment
Вы можете сразу же манипулировать всплывающим окном, чтобы вы могли отображать сообщение Обработка или что-то еще, пока обратный вызов (ы) не будет завершен. - person Matt MacLean; 19.02.2013
comment
@maclema: я понимаю, что это должен быть обратный вызов / обработчик для действия пользователя (в противном случае такая предосторожность была бы легко "обходной"), в этом случае я не посмотреть, где / как / зачем вам отображать такое сообщение ...? но, возможно, я не совсем понял ваш последний комментарий - person Jaroslav Záruba; 19.02.2013
comment
Извините, я имел в виду, если действие пользователя вызвало какой-то процесс сохранения ajax, который вам нужно было дождаться завершения одного или нескольких запросов ajax. - person Matt MacLean; 20.02.2013
comment
var popup = window.open (about: blank, My Page); popup.location = 'my_page.html'; - person shasi kanth; 05.03.2013
comment
Я обнаружил, что даже это сложно, когда вы выполняете стек функций, производных от события onClick. Разочарованный, я обнаружил, что Chrome-расширение OneWindow может немного помочь. - person Ross; 28.07.2014
comment
всякий раз, когда задействован ajax, лучше использовать .on вместо .click ссылка на stackoverflow.com/questions/9344306/: api.jquery.com/on - person happy; 04.10.2015

Вы можете попробовать это:

<a href="javascript:openWindow();">open a new tab please</a>

<script>
    function openWindow(){
        var w = window.open("about:blank");
        w.document.write("heheh new page opened");
    }
</script>
person buddy    schedule 26.03.2013

Это очень просто, чтобы заставить Chrome открываться в новой вкладке, используйте событие onmouseup

onmouseup="switchMenu(event);"

person Felipe.Silva    schedule 10.10.2014

Я пробовал это, и он отлично работал в хроме. Если открытие новой вкладки выполняется пользователем (например, щелчком мыши), это будет работать нормально без каких-либо проблем. Но если код выполняется в другом блоке скрипта, вам может потребоваться включить всплывающие окна в Chrome. Похоже, это касается всех сайтов с приманками.

let newTab = window.open('', '_blank');
if (this.viewerTab == null) {
  console.log("opening in new tab to work, pop-ups should be enabled.");
  return;
}

................

newTab.location.href = viewerUrl;
person int-i    schedule 04.04.2018

window.open('page.html', '_newtab');

Укажите _newtab. Это работает в IE и FF и должно работать в Chrome. Но если у пользователя что-то настроено так, чтобы не открываться в новой вкладке, вы мало что можете сделать.

person DanielCW    schedule 17.08.2012
comment
_newtab ничего не делает в Chrome. - person user1441141; 17.08.2012
comment
Кроме того, я проверил настройки в Chrome и, если я не слепой, я не могу найти, где вы устанавливаете что-либо, что контролирует открытие ссылок. - person user1441141; 17.08.2012