Voici une distillation du problème:
Si j'ouvre une console et que j'entre le code suivant en un seul bloc:
var existingWin = window.open('', 'footerContent');
la première fenêtre.open et le Les appels window.close fonctionnent, mais le deuxième appel window.open ne fonctionne pas. Même si je le retarde pour donner à la fenêtre le temps de se fermer en premier:
var existingWin = window.open('', 'footerContent'); existingWin.close();
cela ne fonctionne pas. Mais si j'exécute les deux premières lignes seul:
var existingWin = window.open('', 'footerContent'); existingWin.close(); setTimeout(function() {var existingWin = window.open('', 'footerContent')}, 3000)
puis entrez séparément:
var existingWin = window.open('', 'footerContent'); existingWin.close(); var existingWin = window.open('', 'footerContent')
cela ouvre maintenant la fenêtre . Cela suggère que le problème est de les exécuter dans le même bloc de code.
Cela me pose des problèmes dans un test unitaire que je construis. Quelqu'un peut-il m'aider à comprendre pourquoi cela se produit et s'il existe un moyen de le contourner? Merci d'avance.
3 Réponses :
L'utilisation du mot var initialise ou réinitialise la variable. Essayez-le sans ce mot, comme:
existingWin = window.open('', 'footerContent');
Merci d'avoir répondu. J'ai essayé cela et cela n'a pas fonctionné. Je soupçonne que cela a à voir avec le placement dans le même bloc car, comme je l'ai dit, il n'y a aucun problème à les exécuter séparément.
Pour ouvrir plusieurs fenêtres, vous devez spécifier un deuxième nom unique comme ci-dessous.
var existingWin = window.open('', 'footerContent'); var existingWin = window.open('', 'footerContent1'); var existingWin = window.open('', 'footerContent2');
Vous pouvez vérifier les détails ici https://javascript.info/popup-windows
Pourquoi avez-vous besoin de faire ça? OP ferme la première fenêtre et réutilise le même nom
Merci d'avoir répondu. J'ai essayé cela et cela n'a pas fonctionné. Je soupçonne que cela a à voir avec le placement dans le même bloc car, comme je l'ai dit, il n'y a aucun problème à les exécuter séparément.
Il s'est avéré qu'il s'agissait d'un paramètre de blocage des fenêtres contextuelles par défaut dans mon navigateur Chrome. Lorsque j'ai changé le réglage, cela a fonctionné comme il se doit. Merci à takrishna de m'avoir orienté dans la bonne direction. Mais cela signifie que je vais probablement utiliser une stratégie différente et rester à l'écart des fenêtres enfants.
À la réflexion, les fenêtres enfants fonctionnent correctement dans l'interface, mais pas dans le cadre d'une seule fonction (c'est ainsi que le test unitaire est structuré.) Je vais donc procéder tel quel et quiconque exécute le test unitaire sera invité à autoriser l'accès complet au domaine.
Dans Chrome, j'ai essayé votre code, c'est-à-dire ceci: var existingWin = window.open ('', 'footerContent'); existingWin.close (); setTimeout (function () {var existingWin = window.open ('', 'footerContent')}, 3000) cela a bien fonctionné
takrishna, je viens de copier et coller votre extrait de code et cela n'a pas fonctionné pour moi. Il ouvre et ferme la première fenêtre mais n'ouvre pas la seconde. Est-il possible qu'il y ait un problème de navigateur? Cela ne semble pas être le cas puisque je l'exécute également dans Chrome entièrement mis à jour. J'essaierai également d'autres navigateurs.
Vous êtes simplement curieux de savoir pourquoi ouvrez-vous une fenêtre dans un test unitaire, et pourquoi auriez-vous besoin de tester qu'elle s'ouvre, se ferme et s'ouvre à nouveau? Aussi, quel est votre environnement, navigateur ...?
il s'ouvre très rapidement, puis le ferme et s'ouvre à nouveau - peut-être ne le voyez-vous pas s'ouvrir et se fermer? essayez de placer un délai avant de fermer
leosteffen, je teste séquentiellement plusieurs éléments d'interface utilisateur qui ouvrent la même fenêtre enfant avec un contenu différent. J'aurais utilisé différents noms / variables si cela aurait aidé, mais il s'avère que ce n'était pas le problème comme je l'ai mentionné ci-dessous.