web-dev-qa-db-fra.com

Comment obtenir les références de toutes les fenêtres enfants déjà ouvertes

Je veux obtenir les références de toutes les fenêtres enfants déjà ouvertes. y a-t-il un moyen? Je n'utilise pas child = window.open(....) mais j'utilise window.open(....) et j'ouvre plusieurs fenêtres enfants.

Si vous ne souhaitez pas modifier votre code actuel, vous pouvez simplement remplacer la fonction window.open():

var openedWindows = [];
window._open = window.open; // saving original function
window.open = function(url,name,params){
    openedWindows.Push(window._open(url,name,params));
    // you can store names also...
}

Exécutez ce code avant d'appeler window.open(). Toutes les références aux fenêtres ouvertes seront stockées dans le tableau openedWindows. Vous pouvez y accéder où vous voulez

57
Hrant Khachatrian

Je ne crois pas que vous puissiez le faire, à moins de connaître le nom des fenêtres, ce que je suppose que vous ne connaissez pas. (Si vous connaissez leurs noms, vous pouvez utiliser window.open("", "name") pour obtenir une référence.)

La meilleure option consiste bien entendu à retenir la référence renvoyée par window.open en premier lieu - mais vous le savez. :-)

16
T.J. Crowder

Ok, j'ai utilisé les réponses à cette question dans Oracle CRM onDemand pour désactiver une sélection dans une fenêtre contextuelle exécutant le script à partir de la fenêtre parente, et cela a fonctionné! (Je n'ai aucun contrôle sur la génération de fenêtres contextuelles, elles sont ouvertes par le cadre d'application)

Voyons comment je l'ai fait:

Contexte : Dans une page de détail, l'utilisateur peut ajouter des informations en cliquant sur une icône en forme de loupe >>> une nouvelle fenêtre contenant un formulaire de recherche s'ouvre, mais une sélection perturbe l'administrateur: Si l'utilisateur modifie sa valeur par défaut il/elle aura accès à des disques interdits !! Oh mon Dieu!

Première approche : Désactiver cette sélection maintenant !!

Tentative : J'ai trouvé l'attribut de l'image avec les outils de développement de mon navigateur (F12). Il y avait une méthode openAssocPopup, puis je connaissais le nom de la fenêtre enfant: 'OccamPopup1' :)

D'accord! Faisons donc un peu de magie (exécuté à la fenêtre parente): 

window.open("","OccamPopup1").document.getElementById("frmSearch.AQ").setAttribute("disabled", true);

Je pense que cela peut aider, car cette question m'a aussi aidé. Tu avais raison. Maintenant, j'essaie d'envelopper l'objet document de l'enfant dans l'objet jQuery du parent afin que je puisse avoir accès à son DOM complet ... mais ceci est une autre histoire ...

Vous feriez mieux de nommer les fenêtres en utilisant un préfixe et un compteur.

Je devais détecter si une fenêtre nommée (c'est-à-dire CBCheckout) était déjà ouverte et l'utiliser:

var signupWindow = window.open('','CBCheckout','toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=1,height=1');
try {
    if (signupWindow.document.location.href == "about:blank") {
        signupWindow.close();
        signupWindow = undefined;
    }
} catch (e) { }

Cette recapturé la référence à la fenêtre ouverte nommée. S'il n'existait pas, vous verrez une petite fenêtre popup pendant une seconde.

Si vous connaissez les noms possibles des fenêtres, vous pouvez les parcourir en essayant de les localiser.

0
Derek Wade