7
votes

window.open () est bloqué par le navigateur quand est appelé de promesse

J'ai un code comme celui-ci:

action().success(function (r) {
  // window.open(...);
}


1 commentaires

Les deux autres réponses sont meilleures et doivent être acceptées à la place de celle qui dit que vous ne pouvez pas le faire.


3 Réponses :


8
votes

Les incendies de la promesse vous répondent à la réponse HTTP de la demande AJAX. Ce n'est pas un événement déclenché par l'utilisateur, les fenêtres contextuelles sont donc bloquées. Utilisez la fenêtre que l'utilisateur vous donne au lieu de créer une nouvelle.


0 commentaires

15
votes

La solution que j'utilise sur ce problème est de

  1. Ouvrez immédiatement la fenêtre et gardez une référence (quand elle est légale, c'est dans le gestionnaire d'événements)
  2. Lancez l'opération asynchrone
  3. Puis, dans la promesse, utilisez la fenêtre que vous avez ouverte et remplissez-la (vous pouvez utiliser win.location )

2 commentaires

Et si je ne sais pas avant la main si j'aurai besoin d'ouvrir une popup? Comme dans: action (). Ensuite (Dowindowopentinghing) .Catch (DosomethindoSethoTo Esntopenapopup) Donc, je ne peux donc pas ouvrir une fenêtre avant la main (pour conserver sa référence, etc.) si plus tard je ne le ferai pas Utilisez-le, non?


@Luiz Une solution hacky pourrait être d'ouvrir cette fenêtre et de le fermer si ce n'est pas nécessaire. Mais je chercherais une solution de contournement basée sur l'ergonomie, par exemple la requête qui pourrait échouer, puis une boîte de dialogue "La chose fonctionnée, voulez-vous voir le résultat dans une nouvelle fenêtre?".



17
votes
            var newTab = $window.open('', '_blank');
        promise
            .then(function () {
                var url = '...';
                newTab.location.href = url;
            });

0 commentaires