web-dev-qa-db-fra.com

Window.open avec 'noopener' ouvre une nouvelle fenêtre au lieu d'un nouvel onglet

J'utilisais window.open('') avec '_blank' comme second paramètre pour ouvrir mon lien dans un nouvel onglet. window.open('http://google.com', '_blank')

Mais récemment, j'ai ajouté le troisième paramètre 'noopener' pour que window.opener devienne nul dans le nouvel onglet et que le nouvel onglet n'ait pas accès à l'onglet/la fenêtre parente. i.e. window.opener est null

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

Le code ci-dessus a donc résolu le problème de sécurité, mais au lieu d'ouvrir un nouvel onglet, une nouvelle fenêtre s'est ouverte, ce qui n'est pas ce à quoi je m'attendais. Les paramètres de mon navigateur étaient les mêmes et aucune modification n’a été apportée.

Est-ce que je peux faire quelque chose pour que ce code ouvre un nouvel onglet au lieu d'une nouvelle fenêtre? Je ne veux pas supprimer noopener comme troisième paramètre

7
Chirag Swadia

Honnêtement, je pense que votre code est correct, mais vous pouvez essayer une implémentation différente:

var yourWindow = window.open();
yourWindow.opener = null;
yourWindow.location = "http://someurl.here";
yourWindow.target = "_blank";
3
Ricardo Costa

Une autre approche permettant de résoudre ce problème sur une seule ligne consiste à accéder directement à la propriété opener et à la définir sur null pour utiliser le fait que window.open() renvoie un objet Window. Cela fonctionnera sur tous les navigateurs pour ouvrir un nouvel onglet avec un window.opener null. 

window.open(url, '_blank').opener = null;
7
keimjohn

C’est la seule chose qui fonctionne pour tous les navigateurs (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
};

1
Alberto
Object.assign(document.createElement('a'), { target: '_blank', href: 'http://google.com', rel: 'noopener noreferrer'}).click()

C’est la méthode que j’ai utilisée récemment. Elle crée une balise d’ancrage et clique dessus. Nous devons utiliser cette solution de contournement comme préférence de l’utilisateur.

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

1
Joe Warner