JavaScript открывается в новом окне, а не во вкладке


364

У меня есть поле выбора, которое вызывает, window.open(url)когда элемент выбран. Firefox откроет страницу в новой вкладке по умолчанию. Однако мне бы хотелось, чтобы страница открывалась в новом окне, а не в новой вкладке.

Как я могу сделать это?


3
см. пример на " jsfiddle.net/HLbLu
Майкл Фрейдгейм


Вы можете использовать github.com/reduardo7/xpopup
Эдуардо Куомо

Ответы:


456

Дайте окну параметр «specs» с шириной / высотой. Смотрите здесь для всех возможных вариантов.

window.open(url, windowName, "height=200,width=200");

Когда вы указываете ширину / высоту, он открывает его в новом окне вместо вкладки.


5
Хороший совет. Я думаю, что Opera все равно откроет это во вкладке :).
Кевин Тиг

7
Работа в IE6, FF 3.6, Chrome 9.0
Джеймс Вестгейт,

3
Больше не работает в FF 11.0, см. Мой вопрос ! @James
TMS

14
Не работает в современных браузерах. По умолчанию все они открывают новые окна в новой вкладке текущего окна. Это также зависит от параметров браузера. Вы не можете управлять им с помощью JavaScript.
Павел Ходек

3
Это НЕ тот факт, что вы вводите "height = 200, width = 200", которые выполняют открытие в новом окне. Это просто факт, чтобы добавить дополнительный параметр (местоположение, статус и т. Д .... это не имеет значения)
Питер

110

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

Для пустого окна:

window.open('', '_blank', 'toolbar=0,location=0,menubar=0');

Для конкретного URL:

window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');

3
Но что, если я тоже хочу дать ему имя?
Aditi

По крайней мере, в Chrome location=0это необходимо, когда JS вызывается из кнопки или элемента привязки.
Охад Шнайдер

работал отлично. должен был также включить location = 0 в firefox.
Рик Джеймс

@nwbrad Вы уверены в части '_blank', потому что, насколько я знаю, _blank является значением по умолчанию, когда мы не указываем никаких других значений. В вашем случае открытие нового окна вместо новой вкладки должно быть связано с предоставлением третьего параметра функции window.open. В вашем случае это «панель инструментов = 0, местоположение = 0, menubar = 0». Вы можете проверить это, пропустив этот третий параметр и оставив в качестве второго параметра '_blank'.
user1451111

Прекрасно работает в современных браузерах, таких как Firefox 76 и Internet Explorer 11. Совет заключается в добавлении location=0параметров. Я бы также предложил назвать окно вместо использования _blankцели, чтобы одно и то же окно использовалось снова, если пользователь несколько раз щелкает элемент, открывающий всплывающее окно, и связывается с focus()тем, чтобы уже открытое всплывающее окно window.open('http://stackoverflow.com', 'Stack_Overflow','location=0').focus();
получало

82

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


1
Вы правы, пользователь может установить для параметра "about: config" "browser.tabs.opentabfor.windowopen" значение true, но это глобальная настройка, и я не хочу изменять глобальное поведение браузеров наших пользователей;)
Адам

45
Я сказал вам, у меня есть код, который работает. Я набрал это в консоли firebug: window.open ("", "poop", "height = 200, width = 200, modal = yes, alwaysRaised = yes"); И угадайте, что??? оно работает!!!!!!

24
Да, это работает, но это похоже на взлом. Firefox написан таким образом, что открытие нового окна по сравнению с вкладкой является предпочтением браузера, а не предпочтением JavaScript. Поэтому возможно, что ваше предложение не будет работать так же в более поздней версии Firefox. Я бы предпочел не полагаться на взломать.
Адам

2
И, чтобы быть ясным, я не имею в виду, что это взлом JavaScript. Добавление высоты и ширины окна - явные особенности метода js window.open ( w3schools.com/HTMLDOM/met_win_open.asp ) Я имею в виду хак в смысле манипулирования предполагаемым поведением firefox.
Адам

2
Я бы не стал называть это хаком как таковым. Вы просто идете на компромисс с тем, какое поведение вы на самом деле хотели бы иметь, и вместо этого реализуете его.
Матчу

15

Пытаться:

window.open("", [window name], "height=XXX,width=XXX,modal=yes,alwaysRaised=yes");

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


Это работает в FF 31 и Chrome 36, используя только опцию «modal = yes». Все указанные параметры работают также. У меня также есть «Открывать новые окна в новых вкладках» в моих настройках FF. Без открытых опций окна открываются в новой вкладке.
Клинт Пахл

После некоторого дополнительного тестирования, кажется, что почти любые параметры (при наличии хотя бы одного) откроют новое окно вместо вкладки. Например, просто «top = 0» даже работает в FF 31 и Chrome 36. Это на OpenBSD с помощью оконного менеджера cwm. Так что результаты могут отличаться.
Клинт Пахл

Могу я узнать, что такое [имя окна]?
шт.

10

Хорошо, после многих испытаний, вот мой вывод:

Когда вы выполняете:

     window.open('www.yourdomain.tld','_blank');
     window.open('www.yourdomain.tld','myWindow');

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

Если вы хотите, чтобы страница открывалась в новом «реальном» окне, вы должны указать дополнительный параметр. Подобно:

window.open('www.yourdomain.tld', 'mywindow','location=1,status=1,scrollbars=1, resizable=1, directories=1, toolbar=1, titlebar=1');

После тестирования кажется, что дополнительный параметр, который вы используете, не имеет значения: дело не в том, что вы вводите «этот параметр» или «этот другой», которые создают новое «реальное окно», а в том, что есть новый параметр (ы). ).

Но что-то запутано и может объяснить множество неправильных ответов:

Эта:

 win1 = window.open('myurl1', 'ID_WIN');
 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');

И это:

 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');
 win1 = window.open('myurl1', 'ID_WIN');

НЕ даст тот же результат.

В первом случае при первом открытии страницы без дополнительных параметров она откроется в новой вкладке . И в этом случае второй вызов также будет открыт на этой вкладке из-за имени, которое вы дадите.

Во втором случае, когда ваш первый вызов сделан с дополнительным параметром, страница откроется в новом « реальном окне ». И в этом случае, даже если второй вызов будет выполнен без дополнительного параметра, он также будет открыт в этом новом « реальном окне » ... но на той же вкладке!

Это означает, что первый звонок важен, так как он решил, где разместить страницу.


В этом ответе должно быть много ++++
Митч ВанДуйн

9

Тебе не нужно это делать. Разрешить пользователю иметь любые предпочтения.

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


31
ты так не прав. и, кстати, говорить «тебе не нужно» неуместно, особенно если это то, чего хочет босс

8
Давайте попробуем сохранить комментарии практичными и полезными. Мы можем не соглашаться, не оскорбляя.
Адам

17
@theman_on_vista: Убедить ваш босс ваша ответственность. Ваша компания возложила на вас ответственность за решение проблем дизайна. Это включает в себя указание на неправильные идеи дизайна.
EFraim

2
Это точно. Экран принадлежит пользователю, и больше никому.
Кристофер Кройциг

12
Именно в дизайнере можно выбрать всплывающее окно или вкладку. Хотя я пользователь, который всегда предпочитает вкладки, я понимаю, что иногда дизайн действительно требует всплывающего окна или действительно вызывает вкладку. Это должно быть в сфере программирования, чтобы сделать это возможным. Оставляя в стороне философские различия, этот вид комментариев совершенно не подходит для справочного сайта по программированию. И в этом случае это не «я должен?» вопрос. Это "как я?"
jbenet

9

Вы можете попробовать следующую функцию:

<script type="text/javascript">
function open(url)
{
  var popup = window.open(url, "_blank", "width=200, height=200") ;
  popup.location = URL;
}
</script>

HTML-код для исполнения:

<a href="#" onclick="open('http://www.google.com')">google search</a>

2
Какова цель popup.location = URL;? window.open()Вызов должен открыть его в соответствующий URL, и в вашем примере кода, URLне определен , так что будет падать назад к экспериментальным (и не широко поддержка) объекта URL . Хотя использование этого для этого является спорным, мне любопытно, какие мотивы для его использования здесь?
Кен,

Твердый ответ и научил меня, как сделать местоположение недоступным для редактирования. спасибо
VirtualProdigy

6

Ключом являются параметры:

Если вы укажете Параметры [Высота = "", Ширина = ""], то он откроется в новых окнах.

Если вы не предоставите параметры, то он откроется в новой вкладке.

Протестировано в Chrome и Firefox


1
newwin = window.open ('test.aspx', '', ''); проверено в Chrome: 26
MuniR

5

Интересно, что я обнаружил, что если вы передадите пустую строку (в отличие от пустой строки или списка свойств) для третьего атрибута window.open, он откроется в новой вкладке для Chrome, Firefox и IE. Если отсутствовал, поведение было другим.

Итак, это мой новый звонок:

 window.open(url, windowName, '');

Разве оригинальный постер не пытается открыть всплывающие окна в новом окне? Кроме того, в IE 11 приведенный вами фрагмент кода откроет новое окно или вкладку в зависимости от предпочтений браузера пользователя.

4

попробуйте этот метод .....

function popitup(url) {
       //alert(url);
       newwindow=window.open("http://www.zeeshanakhter.com","_blank","toolbar=yes,scrollbars=yes, resizable=yes, top=500, left=500, width=400, height=400");
       newwindow.moveTo(350,150);
   if (window.focus) 
          {
             newwindow.focus()
          }
   return false;
  }

3

Для меня решение было иметь

"location=0"

в 3-м параметре. Протестировано на последней версии FF / Chrome и старой версии IE11

Полный вызов метода, который я использую ниже (как я люблю использовать переменную ширину):

window.open(url, "window" + id, 'toolbar=0,location=0,scrollbars=1,statusbar=1,menubar=0,resizable=1,width=' + width + ',height=800,left=100,top=50');

2

Я только что попробовал это с IE (11) и Chrome (54.0.2794.1 канарейка SyzyASan):

window.open(url, "_blank", "x=y")

... и он открылся в новом окне.

Это означает, что Клинт Пахл правильно понял , когда сказал, что предоставление какого-либо одного параметра приведет к открытию нового окна.

- и, видимо, это не должно быть законным параметром!

(YMMV - как я уже сказал, я тестировал его только в двух местах ... и следующее обновление может аннулировать результаты в любом случае)

ETA: Я только что заметил - в IE окно не имеет декораций.


1

Ответили здесь . Но разместив его снова для справки.

window.open()не будет открываться в новой вкладке, если это не происходит при фактическом событии клика. В приведенном примере URL открывается при фактическом событии клика. Это будет работать при условии, что у пользователя есть соответствующие настройки в браузере.

<a class="link">Link</a>
<script  type="text/javascript">
     $("a.link").on("click",function(){
         window.open('www.yourdomain.com','_blank');
     });
</script>

Точно так же, если вы пытаетесь выполнить ajax-вызов внутри функции click и хотите открыть окно в случае успеха, убедитесь, что вы делаете ajax-вызов с async : falseустановленным параметром.


1

Я думаю, что это не проблема целевых свойств html, но вы сняли флажок «открывать новые окна в новой вкладке вместо» во вкладке «вкладка» в меню «Параметры» Firefox. проверьте это и попробуйте снова.

введите описание изображения здесь


0

У меня был тот же вопрос, но я нашел относительно простое решение.

В JavaScript я проверял, window.opener !=null;было ли окно всплывающим. Если вы используете какой-то подобный код обнаружения, чтобы определить, является ли окно, в котором вы отображаете сайт, всплывающим, вы можете легко его «отключить», если вы хотите открыть «новое» окно, используя JavaScript для новых окон.

Просто поместите это в верхней части своей страницы, чтобы вы всегда были «новым» окном.

<script type="text/javascript">
    window.opener=null;
</script>

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

Вы можете даже создать простую страницу перенаправления, которая делает это и затем переходит на URL, который вы ей дали. Что-то вроде,

JavaScript на родительской странице:

window.open("MyRedirect.html?URL="+URL, "_blank");

И затем с помощью небольшого javascript отсюда вы можете получить URL и перенаправить на него.

JavaScript на странице перенаправления:

 <script type="text/javascript">
        window.opener=null;

    function getSearchParameters() {
          var prmstr = window.location.search.substr(1);
          return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
    }

    function transformToAssocArray( prmstr ) {
        var params = {};
        var prmarr = prmstr.split("&");
        for ( var i = 0; i < prmarr.length; i++) {
            var tmparr = prmarr[i].split("=");
            params[tmparr[0]] = tmparr[1];
        }
        return params;
    }

    var params = getSearchParameters();
    window.location = params.URL;
    </script>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.