web-dev-qa-db-fra.com

Forcer window.open () à créer un nouvel onglet en chrome

J'utilise window.open pour remplir une nouvelle fenêtre avec un contenu variable. Généralement des rapports et du HTML stocké à partir de processus automatisés.

J'ai remarqué un comportement très incohérent avec Chrome en ce qui concerne window.open ().

Certains de mes appels vont créer un nouvel onglet (comportement préféré) et d'autres causer des popups.

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

page_content est simplement du code HTML normal à partir d'appels AJAX. Les rapports contiennent des informations dans l'en-tête telles que title, favicon et des feuilles de style.

Dans IE9, le code crée un nouvel onglet au lieu d'une fenêtre contextuelle, alors que Chrome refuse catégoriquement d'afficher le contenu en question dans un nouvel onglet. Le contenu étant des données commerciales sensibles, je ne peux pas le publier ici. Je répondrai aux questions si je peux.

Je sais que certaines personnes diront que c'est un comportement laissé à l'utilisateur, mais c'est une plate-forme d'entreprise interne. Nous n'avons pas le temps de former tous les utilisateurs sur la gestion des fenêtres contextuelles, nous avons simplement besoin que cela apparaisse dans un nouvel onglet. Heck, même une nouvelle fenêtre serait préférable à la popup car vous ne pouvez pas ancrer une popup dans Chrome. Sans parler du code bloquant le popup qui l’affecterait.

Apprécier toute idée.

26
user1441141

window.open doit être appelé dans un rappel déclenché par une action de l'utilisateur (exemple, onclick) pour que la page s'ouvre dans un nouvel onglet au lieu d'une fenêtre.

Exemple:

$("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';
    });
});
40
Matt MacLean

Vous pouvez essayer ceci:

<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>
3
buddy
window.open('page.html', '_newtab');

Spécifiez le '_newtab'. Cela fonctionne dans IE et FF, et devrait fonctionner dans Chrome. Mais si l'utilisateur a configuré des éléments pour ne pas les ouvrir dans un nouvel onglet, vous ne pouvez pas faire grand chose.

0
DanielCW

J'ai essayé cela et cela a bien fonctionné en chrome. Si vous ouvrez un nouvel onglet sur une action de l'utilisateur (telle qu'un clic de souris), cela fonctionnera sans problème. Mais si le code est exécuté dans un autre bloc de script, vous devrez peut-être activer les fenêtres contextuelles en chrome. On dirait que c'est pour gérer tous les sites click-bait.

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;
0
int-i