Perte de fenêtre parent lors de superposition

cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015 - 12 mars 2007 à 18:46
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015 - 13 mars 2007 à 16:06
Bonsoir,

J'ai un script A qui ouvre une fenêtre B avec "window.open"

La fenêtre B ouvre la fenêtre C


De façon aléatoire C faisait disparaître B. C'est à dire que lorsque je
cliquais sur mon bouton retour de C, je revenais directement à A sans
passer par B et cela de temps en temps.


Je n'ai pas réussi à savoir pourquoi.


J'ai fini par décaler "top=50, left=50" l'ouverture de C et de temps en temps elle se calque qu'en même sur la position de B. Si C est sur B, j'ai perdu B.

Et comme je dois revenir à fenêtre parent, il ne sait pas où aller.


Est-ce normal ? Non


Quelle information pert-il de façon aléatoire ?

Je suis sous FF et que sous FF


Merci d'avance
A voir également:

14 réponses

stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
12 mars 2007 à 19:16
A mon avis, comme tu fait window.close() et que c'est une fenêtre ouverte dynamiquement, alors l'opener reste le même :
A>>B (opener=a)>>C (opener=b=a);
Mais je sais pas trop...

<hr />Le travail n'a jamais tué personne, mais pourquoi prendre le rique ?
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
12 mars 2007 à 19:30
Pourquoi de façon aléatoire.

Lorsque j'ouvre B à partir de A puis C à partir B et que je vois que C c'est calé sur B, je clique sur retour et je me retrouve sur A.
Je clique pour ouvrir B puis C et là C est bien décalé par rapport à B.
0
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
12 mars 2007 à 19:51
alors dans ce cas, je ne comprends pas le problème, mais je vais essayer de le résoudre... :)
tu as essayé d'ouvrir les deux fenêtres a partir de A ? (je sens que g rien compris)

<hr />Le travail n'a jamais tué personne, mais pourquoi prendre le rique ?
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
12 mars 2007 à 20:00
Non, je n'ai pas essayé parce que les fenêtres doivent s'ouvrir dans cette ordre A puis B puis C, les ouvertures se faisant à la demande par un onclick.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
12 mars 2007 à 20:27
Oui, mais je parle par exemple :
fenetre A :
function ouvrirb()
{
window.open("bidule",'truc');
}

function ouvrirc()
{
window.open("chose",'machin');
}

fenetre b:
window.opener.ouvrirc();

voilà (pas testé)

<hr />Le travail n'a jamais tué personne, mais pourquoi prendre le rique ?
0
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
12 mars 2007 à 20:43
Ou sinon, fourni ton code pour que je vois...

<hr />Le travail n'a jamais tué personne, mais pourquoi prendre le rique ?
0
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
12 mars 2007 à 20:43
Ou sinon, fourni ton code pour que je vois...

<hr />Le travail n'a jamais tué personne, mais pourquoi prendre le rique ?
0
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
12 mars 2007 à 20:43
Oups... dsl pour les deux messages...

<hr />Le travail n'a jamais tué personne, mais pourquoi prendre le rique ?
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
12 mars 2007 à 21:07
Voici le javascript d'appel des fenêtres :

///function: myShowModalDialog(url,mode,reference)
//  arguments:
//   -url : url to open in the popup
//   -mode : innerHTML | value | function | functionRef | style.<JS_style_property>
//   -reference :
//        avec le mode 'innerHTML' ou 'value' il s'agit de l'id de l'element dans
//        le DOM qu'il faudra mettre à jour
//        en mode 'function' il s'agit du nom de la fonction sous forme de chaine
//      alors qu'avec 'functionRef' il s'agit de la function elle même (pointeur)
//   -windowParam: troisiement argument de window.open
function newShowModalDialog(url,mode,reference,windowParam)
{
    var winOpenned=MODAL_alreadyOpen(mode,reference);
    if(winOpenned!=null) { winOpenned.focus(); return; }
    var id=MODAL_DIALOG_LIST.length;
    var newWin=window.open(url,'modal_'+id,windowParam);
    MODAL_DIALOG_LIST.push(Array(newWin,mode,reference,true));  //format win, mode, referecene , isOpen
}

//Fonction que doit appeler la fenetre modale pour transmettre la nouvelle valeur
// Exemple de code a placer dans votre fenetre modale :
//   window.opener.modalCallBackFunction(window.self,'MA VALEUR');
function modalCallBackFunction(winRef,newValue)
{
    if(newValue==null) { return; } //pas de valeur renvoyé
   
      var modalObj=MODAL_findModalByWinRef(winRef);
    if(MODAL_findModalByWinRef==null)  //impossible de trouver la modal correspondante
    {
        alert('Error : unable to found window reference for callBack procedure.');
    }
    else
    {
        var modeList=Array();
        modeList=modalObj[1].split('|');
        for(var i=0 ; i<modeList.length ; i++)
        {
            switch(modeList[i])
            {
                case 'innerHTML' :
                    var tmp=document.getElementById(modalObj[2]);
                    tmp.innerHTML=newValue;
                    break;
                case 'value' :
                    var tmp=document.getElementById(modalObj[2]);
                    tmp.value=newValue;
                    break;
                case 'function' :
                    eval(modalObj[2]+'(\''+newValue+'\')');
                    break;
                case 'functionRef' :
                    modalObj[2](newValue);
                    break;
                default :
                    if(modeList[i].indexOf('style.')==0)  //exemple style.backgroundColor
                    {
                        //ATTENTION newValue doit être correctement formatte,
                        //a vous de faire en sorte que votre fenetre modale renvoie la bonne valeur avec le bon formatage
                        // exemeple qu'une couleur soit au format '#ff0033' ou rgb(255,0,85) etc...
                        try
                        {
                            eval('document.getElementById(\''+modalObj[2]+'\').'+modeList[i]+'=\''+newValue+'\';');
                        } catch(e) { ; }
                    }
                    break;
            }
        }
    }
}

//---- Inutile de regarder plus bas, seul la fonction newShowModalDialog est a appeler pour construire  une fenetre modal --//

// Variables globales du script
var MODAL_DIALOG_LIST=Array();

//méthode globales du script
function MODAL_alreadyOpen(mode,reference)
{
    for(var i=0 ; i<MODAL_DIALOG_LIST.length ; i++)
    {
        if(MODAL_DIALOG_LIST[i][1]==mode && MODAL_DIALOG_LIST[i][2]==reference && MODAL_DIALOG_LIST[i][3])
        {
          //on test si elle est encore ouverte
          if(MODAL_DIALOG_LIST[i][0].document) { return MODAL_DIALOG_LIST[i][0]; }
          else   //la fenetre a été fermée sans qu'elle est pu prevenir la fenetre mere, on corrige donc le flag isOpen
          {
              MODAL_DIALOG_LIST[i][3]=false;
          }
        }
    }
    return null;
}

function MODAL_findModalByWinRef(winRef)
{
    for(var i=0 ; i<MODAL_DIALOG_LIST.length ; i++)
    {
        if(MODAL_DIALOG_LIST[i][0]==winRef && MODAL_DIALOG_LIST[i][3])
        {
          //on test si elle est encore ouverte
          if(MODAL_DIALOG_LIST[i][0].document) { return MODAL_DIALOG_LIST[i]; }
          else   //la fenetre a été fermée sans qu'elle est pu prevenir la fenetre mere, on corrige donc le flag isOpen
          {
              MODAL_DIALOG_LIST[i][3]=false;
          }
        }
    }
    return null;
}

//force le focus sur les modal encore ouverte (en thoerie il ne peut y en avoir qu'une seule encore d'ouverte)
function MODAL_forceFocusOnModal()
{
    for(var i=0 ; i<MODAL_DIALOG_LIST.length ; i++)
    {
        if(MODAL_DIALOG_LIST[i][3] && MODAL_DIALOG_LIST[i][0].document) { MODAL_DIALOG_LIST[i][0].focus(); }
    }
    return;
}

//ajout d'un handler sur la reprise du focus, permettant d'imediatement redonner le focus a une eventuelle modal encore ouverte
if (document.addEventListener) { document.addEventListener("focus", MODAL_forceFocusOnModal, true); }
else if (document.attachEvent) { document.attachEvent("onfocus", MODAL_forceFocusOnModal); }

Et voici comment je les appels

Merci
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
12 mars 2007 à 21:47
B
onjour...
sans tout avoir lu...
pourquoi ne pas mettre sur l'événement onunload des sous fenêtres un window.opener.focus();
;0)
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
12 mars 2007 à 22:11
Je ne vois pas bien
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
12 mars 2007 à 22:25
...juste rajouter dans la balise des pages ouvertes





;0)
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
12 mars 2007 à 23:05
Cela ne change rien.
0
cousinlol Messages postés 59 Date d'inscription mercredi 21 juin 2006 Statut Membre Dernière intervention 26 octobre 2015
13 mars 2007 à 16:06
A chercher à cerner l'effet aléatoire du phénomène, je crois que j'ai trouvé quand cela se produit.


On défini que "A" est un fomulaire dans un onglet de FF et "B" et "C" des fenêtres de style popup ouvertes avec window.open


J'affiche ""A pour la 1ère fois, je fais un window.open de "B", puis un
window.open de "C". "B" et "C" se confondent c'est la cata.


Je reviens sur "A" sans le raffraîchir, je me promène de "B" à "C" sans problème.


Je raffaîchi "A", et à nouveau "B" et "C" se confondent.


C'est donc lors de la 1ère utilisation des fenêtres que la supperposition se produit.


Quel élément est inconnu la 1ère fois ?
0
Rejoignez-nous