Window.open с «noopener» открывает новое окно вместо новой вкладки

Я использовал window.open('') с '_blank' в качестве второго параметра, чтобы открыть ссылку на новой вкладке. Например. window.open('http://google.com', '_blank')

Но недавно я добавил третий параметр 'noopener', чтобы window.opener стал нулевым на новой вкладке, а новая вкладка не имела доступа к родительской вкладке/окну. то есть window.opener есть null

window.open('http://google.com', '_blank', 'noopener')

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

Есть ли что-нибудь, что я могу сделать, чтобы этот код открывал новую вкладку вместо нового окна? Я не хочу удалять noopener в качестве третьего параметра


person Chirag Swadia    schedule 14.03.2018    source источник
comment
Возможный дубликат Использование rel=noopener в window.open()   -  person Stender    schedule 14.03.2018
comment
Я не думаю, что это дубликат, ссылка, опубликованная @Stender, касается того, что noopener не работает, а не об изменении поведения вкладки/окна. Это происходит во всех браузерах одинаково? Это может быть ошибка/несоответствие браузера.   -  person mayacoda    schedule 14.03.2018
comment
Да, у меня это работало одинаково в Chrome, Firefox и IE.   -  person Chirag Swadia    schedule 14.03.2018
comment
Я предполагаю, что правильный синтаксис будет noopener=1/true/yes. Похоже, что все остальные функции окна будут каким-то образом связаны с окном с хромом, и noopener — единственная, которая на самом деле полезна также и во вкладках. Возможно, это было забыто в реализациях браузера, и когда аргумент windowFeature присутствует, окно будет автоматически открыто в новом окне вместо вкладки. Я сделал небольшой тест с FF, и он открывает новое окно, если присутствует аргумент windowFeatures, значение аргумента не имеет значения, оно может быть даже тарабарщиной...   -  person Teemu    schedule 14.03.2018


Ответы (4)


Честно говоря, я думаю, что ваш код в порядке, но вы можете попробовать другую реализацию:

var yourWindow = window.open();
yourWindow.opener = null;
yourWindow.location = "http://someurl.here";
yourWindow.target = "_blank";
person Ricardo Costa    schedule 14.03.2018
comment
Обратите внимание, что использование yourWindow.target = _self не работает должным образом в Safari по состоянию на 31 марта 2020 г. Используйте var yourWindow = window.open(someurl.here, _self); ваше окно.opener = ноль; - person Adam Gerard; 01.04.2020

Другой подход, который решает эту проблему в одной строке, заключается в прямом доступе к свойству opener и установке для него значения null, чтобы использовать тот факт, что window.open() возвращает объект Window. Это будет работать во всех браузерах, чтобы открыть новую вкладку с нулевым window.opener.

window.open(url, '_blank').opener = null;
person keimjohn    schedule 13.07.2018
comment
Выглядит немного хакерским, но это единственное найденное мной решение, которое надежно работает во всех современных браузерах. - person foxylion; 25.09.2018

https://mathiasbynens.github.io/rel-noopener/

const anchor = document.createElement('a');

Object.assign(anchor, {
  target: '_blank',
  href: 'http://google.com',
  rel: 'noopener noreferrer'
})
.click()

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

person Joe Warner    schedule 14.03.2018

Это единственное, что у меня работает в разных браузерах (IE11, Chrome 66, FF 60, Safari 11.1).

function openURL(url) {
  var link = document.createElement('a');
  link.target = "_blank";
  link.href = url;
  link.rel = "noopener noreferrer";
  document.body.appendChild(link); // you need to add it to the DOM to get FF working
  link.click();
  link.parentNode.removeChild(link); // link.remove(); doesn't work on IE11
};

person Alberto    schedule 29.05.2018