11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je cherche une façon de dialoguer entre plusieurs fenêtre sans connaître leur hiérarchie mais en s'adressant à elles seulement par l'utilisation de leur nom en direct.

Je précise un peu la situation :

J'ai une première fenêtre que j'ouvre directement via la barre d'adresse du navigateur. Pour pouvoir y faire référence après, je la nomme en insérant dans le body le code suivant :



		<SCRIPT LANGUAGE="JavaScript">
			<!--
			window.name = "toto";
			-->
		</script>


Plus tard j'ouvre un certain nombre de fenêtres en pop-up et parfois plusieurs à la suite.
Je voudrai depuis une de mes pop-up, en cliquant sur un lien, mettre le focus à ma première fenêtre (Je ne connais pas la hiérarchie de ces fenêtres et ne peux donc pas jouer avec window.opener).
J'ai essayé pour cela le code suivant :
<a href="javascript:void(0);"  onclick="toto.focus();">


Mais rien à faire. Je pense que je ne m'adresse pas à ma fenêtre de la bonne façon...

Auriez-vous une idée de comment faire ?


Antoine
Modifié par RockMakesMeSweat (31 Oct 2007 - 17:12)
Salut RockMakesMeSweat,

Pour retourner à ta fenêtre parente quelque soit ta hierarchie et / ou la profondeur d'imbrication de tes popup, il faut que tu crées une "chaine" (souvent utilisée avec le pattern decorator) :

fichier test1.html :
window.blop = 'bloooop';

window.getOpener = function() {
	return this;
};

window.open('test2.html', 'test2', 'width=200, height=200');


fichier test2.html :
window.getOpener = function() {
	return this.opener.getOpener();
};

window.open('test3.html', 'test3', 'width=200, height=200');


fichier test3.html (le même que test2 en gros) :
window.getOpener = function() {
	return this.opener.getOpener();
};

window.open('test4.html', 'test4', 'width=200, height=200');


enfin test4.html, qui "ferme" la chaine :
alert(window.opener.getOpener().blop); // bloooop
Merci Ze Nenex pour ta réponse !

Je vais essayer cette piste mais j'ai peur qu'elle ne me permette pas de m'en sortir dans ma situation...

Mais en poussant un peu le problème, n'y a t'il pas moyen de cibler une fenêtre directement par son nom ? ce serait quand même vachement plus pratique !

Imaginons que tantôt, je veuille depuis test4.html mettre le focus test1.html et tantôt su test2.html, je suis obligé de me refaire une chaîne pour accéder à test2.html : Pas très rigolo Smiley smile

Pas de solution dans cette direction ?


Antoine
J'imagine que tu pourrais, même si c'est détourner un peu le but d'une telle chaine, introduire un compteur pour accéder à tes fenêtres parentes tel un historique :

Dans un fichier chainé :
window.getOpener = function(cnt) {

	return cnt > 0 ? this.opener.getOpener(--cnt): this.opener;
};


Dans un autre fichier :
var myWin = window.getOpener(2); // retourne de 2 fenetres


A tester...

a écrit :
Mais en poussant un peu le problème, n'y a t'il pas moyen de cibler une fenêtre directement par son nom ? ce serait quand même vachement plus pratique !

Là tu me pose une colle. Ma première réponse serait que non, on ne peut pas Smiley cligne
Modifié par Ze Nenex (31 Oct 2007 - 18:09)
Mais c'est là qu'est tout le problème !

Je connais à un instant T le nom de la fenêtre que je souhaite appeler mais je ne connais pas sa position dans le chaînage des fenêtre et ne peux donc pas donner une valeur à cnt !

Je perds espoir

;)
Modifié par RockMakesMeSweat (31 Oct 2007 - 18:02)
RockMakesMeSweat a écrit :
Je connais à un instant T le nom de la fenêtre que je souhaite appeler mais je ne connais pas sa position dans le chaînage des fenêtre et ne peux donc pas donner une valeur à cnt !


Dans ce cas test plutot avec son nom, et non une position :

window.getOpener = function(winName) {
  return this.opener.name == winName ? this.opener: this.opener.getOpener(winName);
};


Toujours à tester bien sur.
Merci beauvoup pour le bout de code :

window.getOpener = function() {
return this.opener.getOpener();
}

Ça m a solutionné un probleme de comunication entre une fenetre fille et une fenetre grand mere.
Ça marche avec Firefox 3, mais ça plante IE 7, et je ne comprends pas pourquoi .
Unse solution ??