11548 sujets

JavaScript, DOM et API Web HTML5

Pages :
Bonjour !

J'ai un petit souci avec une pop-in. J'ai créé une pop-in qui s'ouvre en même temps qu'on arrive sur la première page de mon site. Cette page, créée en .asp, appelle un .js qui crée le pop-in comme ceci :

document.write('<div "id="popin">');
/*...contenu de ma pop-in...*/
document.write('</div>');


Je l'ai centrée par rapport à la page du navigateur, jusque là tout va bien. Le problème est que lorsque je redimmensionne la fenêtre du navigateur, mon div ne bouge pas et donc n'est plus centré !! Avez-vous une idée pour faire cela ??

Merci d'avance Smiley cligne

Romain
Modifié par rom117 (20 May 2010 - 15:28)
Modérateur
Bonjour,

Pour simplifier les choses, je te recommande d'utiliser une librairie comme JQuery, et d'utiliser un script comme Fancybox. C'est très simple d'utilisation, très flexible et ça gère déjà tout ça.
Salut Tony.

Merci de ta réponse rapide. Ta solution est une très bonne idée, le problème est que la page .asp qui appelle la pop-in ne m'appartient pas. Dans cette page est inclue le fichier .js créé pour la pop-in mais je ne pas pas inclure d'autres fichiers (comme un fichier jQuery).
Y a-t-il un autre moyen ??

Merci d'avance, Romain.
Modérateur
Bien, tu peux toujours utiliser l'événement window.onresize pour appeler ta fonction de centrage.
Petite question en plus : le recentrage marche très bien mais ce n'est pas fluide. Y a-t-il moyen de régler ça ??

Merci encore pour ta solution Smiley cligne .
Pour plus de précision, voici ce que j'utilise pour centrer la page la première fois :

var wtx = (document.body.clientWidth);
var htx = (document.body.clientHeight);
var wtx2=((wtx-400)*0.5);
var htx2= ((htx-325)*0.5);
JSFX("popin", wtx2,htx2).floatIt();

400 et 325 correspondent aux dimensions de ma pop-in. Les paramètres de la fonction sont donc le nom du div, la distance à laisser à gauche et à droite de la pop-in et, 3ème argument la distance à laisser en haut et en bas de la pop-in.

Voici le code de la fonction JSFX :

function JSFX(id, sx, sy)
{
	var el=d.getElementById?d.getElementById(id):d.all?d.all[id]:d.layers[id];
	var px = document.layers ? "" : "px";
	window[id + "_obj"] = el;
	if(d.layers)el.style=el;
	el.cx = el.sx = sx;el.cy = el.sy = sy;
	el.sP=function(x,y){this.style.left=x+px;this.style.top=y+px;};

	el.floatIt=function()
	{
		var pX, pY;
		pX = (this.sx >= 0) ? 0 : ns ? innerWidth : 
		document.documentElement && document.documentElement.clientWidth ? 
		document.documentElement.clientWidth : document.body.clientWidth;
		pY = ns ? pageYOffset : document.documentElement && document.documentElement.scrollTop ? 
		document.documentElement.scrollTop : document.body.scrollTop;
		if(this.sy<0) 
		pY += ns ? innerHeight : document.documentElement && document.documentElement.clientHeight ? 
		document.documentElement.clientHeight : document.body.clientHeight;
		this.cx += (pX + this.sx - this.cx)/8;
		this.cy += (pY + this.sy - this.cy)/8;
		this.sP(this.cx, this.cy);
		setTimeout(this.id + "_obj.floatIt()", 40);
	}
	return el;
}


Pour rappeler cette fonction à chaque redimmensionnement de la fenêtre, voici le code :

window.onresize=resize;

function resize()
{
	var wtx = (document.body.clientWidth);
	var htx = (document.body.clientHeight);
	var wtx2=((wtx-400)*0.5);
	var htx2= ((htx-325)*0.5);
	JSFX("popin", wtx2,htx2).floatIt();
}


Y a-t-il quelque chose à changer dans JSFX ?? (j'avoue que je ne comprends pas trop cette fonction...)

Je précise que la première fois qu'apparaît la pop-in tout est fluide. A partir du moment où on redimmensionne, là ce n'est plus fluide.


Merci d'avance.
Modifié par rom117 (07 May 2010 - 17:50)
Je viens de m'apercevoir d'une chose. Dans la fonction JSFX, on écrit :
setTimeout(this.id + "_obj.floatIt()", 40); 

Ce qui veut dire que la fonction est rappelée régulièrement, donc pas besoin de window.onresize, non ??
setTimeout n'est exécuté qu'une fois ?? Dans ce cas-là, comment ça se fait que le recentrage en fonction du redimmensionnement de la fenêtre marche plus ou moins sans le window.resize ?? Ma fonction JSFX n'est appelée qu'une fois, à la création de la pop-in !
En fait si je ne met pas window.resize, tout est fluide, mais ma pop-in ne se met pas au centre ! (je reviens au point de départ donc)
Modérateur
setTimeout n'exécute la fonction qu'une seule fois après un délai de 40 millisecondes, mais dans ton script, c'est apparemment fait récursivement. Le setTimeout appelle la fonction qui appelle le setTimeout qui appelle la fonction qui appelle le setTimeout qui [...].

Donc si je te suis bien, le centrage se fait automatiquement après un petit délai? Si oui, pourquoi cherchais-tu à le faire au redimensionnement de la fenêtre?

Je suis un peu confu... Smiley confus

Il faudrait que je prenne le temps d'analyser et tester ton script. Répondre en vitesse, ce n'est pas terrible. Je vais essayer de revenir là-dessus plus tard quand je serai plus disponible.
Modifié par Tony Monast (07 May 2010 - 21:09)
Modérateur
En attendant, ce serait bien si tu créais une page vierge avec ton script à l'intérieur et ton popup. C'est toujours plus facile avec une page en ligne.
Si tu es un peu confus, c'est que moi aussi !
La fonction, elle vient d'ici :
http://www.javascript-fx.com/submitscripts/float/float.html. Il y a un menu flottant à gauche et ça marche. Moi la complexité en plus, c'est que je veux centrer ce menu (por moi c'est un div, c'est ma pop-in) horizontalement et verticalement.
En fait au début je croyais que ça ne marchais pas, qu'il fallait un window.resize, mais en revenant sur le site plus haut je me suis aperçu que ce n'était pas utilisé et que ça marchait sans ça.
Quand je dis que ça ne marchait pas, je veux dire que ça ne se recentrait pas. En changeant la valeur de la largeur et en mettant un chiffre négatif pour la largeur dans l'appel de JSFX, là le repositionnement automatique a marché mais je n'arrivais plus à mettre ma pop-in au centre !
Bref, j'ai fait pas mal d'essais, jusque-là en vain.

Merci encore et toujours pour ton aide.

Romain
Modérateur
J'ai essayé le script original sur une page web vierge, et c'est bien ce que je pensais, c'est récursif. Même si tu ne fais rien dans le navigateur, la fonction floatIt s'appelle elle-même et s'exécute à chaque 40 millisecondes. C'est donc dans cette fonction que tu dois centrer horizontalement.

Je trouve ça quand même gourmand en ressources... Le script de positionnement ne s'arrête jamais. Smiley rolleyes

Je crois que ce serait beaucoup plus propre et flexible d'utiliser une librairie ou sinon, de restructurer ce script plus convenablement.
Modifié par Tony Monast (07 May 2010 - 21:48)
Récursif ? Ah Smiley rolleyes ? Comment tu le vois ? Je veux dire dans le code, à quel moment on le voit ??

Utiliser une librairie ? Ce n'est malheureusement pas possible, à moins de pouvoir l'appeler dans le fichier javascript de la pop-in (appeler un js dans un js, c'est possible ??), car je ne peux pas modifier le fichier qui appelle la pop-in. Ce fichier inclut le fichier .js de la pop-in, c'est tout !

Restructurer le script ? Je veux bien mais pour cela il faudrait que je le comprenne... Smiley bawling
Modérateur
rom117 a écrit :
Récursif ? Ah Smiley rolleyes ? Comment tu le vois ? Je veux dire dans le code, à quel moment on le voit ??


Dans floatIt, il y a un setTimeout qui appelle floatIt, donc lui-même.


function JSFX(id, sx, sy) 
{ 
    var el=d.getElementById?d.getElementById(id):d.all?d.all  :d.layers  ; 
    var px = document.layers ? "" : "px"; 
    window[id + "_obj"] = el; 
    if(d.layers)el.style=el; 
    el.cx = el.sx = sx;el.cy = el.sy = sy; 
    el.sP=function(x,y){this.style.left=x+px;this.style.top=y+px;}; 
 
    [b]el.[#red]floatIt[/#]=function()[/b]
    { 
        var pX, pY; 
        pX = (this.sx >= 0) ? 0 : ns ? innerWidth :  
        document.documentElement && document.documentElement.clientWidth ?  
        document.documentElement.clientWidth : document.body.clientWidth; 
        pY = ns ? pageYOffset : document.documentElement && document.documentElement.scrollTop ?  
        document.documentElement.scrollTop : document.body.scrollTop; 
        if(this.sy<0)  
        pY += ns ? innerHeight : document.documentElement && document.documentElement.clientHeight ?  
        document.documentElement.clientHeight : document.body.clientHeight; 
        this.cx += (pX + this.sx - this.cx)/8; 
        this.cy += (pY + this.sy - this.cy)/8; 
        this.sP(this.cx, this.cy); 
        [b]setTimeout(this.id + "_obj.[#red]floatIt()[/#]", 40); [/b]
    } 
    return el; 
} 
Salut !

Alors, j'ai un peu avancé mais ça marche toujours pas ! J'ai un peu modifié le code alors je redonne tout :

Voici le fichier index.html pour tester :
<html>
	<head> 
		<link rel="stylesheet" type="text/css" href="style.css">
	</head>
	<body>
		<script LANGUAGE="Javascript" src="pop-in.js"></script>
		<h1>First page</h1>
		<p>Launching of the pop-in...</p>
		<p>laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</p>
		<p>SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />
			SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />
			SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />SCROLL<br />
		</p>
	</body>
</html>


Voici le fichier pop-in.js pour afficher la pop-in:
document.write('<div "id="popin">'); 
document.write('content of my pop-in'); 
document.write('</div>'); 


var wtx = (document.body.clientWidth); 
var htx = (document.body.clientHeight); 
var wtx2=((wtx-325)*0.5); 
var htx2= ((htx-400)*0.5); 

var ns = (navigator.appName.indexOf("Netscape") != -1);
var d = document;

function JSFX(id, sx, sy) 
{ 
    var el=d.getElementById?d.getElementById(id):d.all?d.all  :d.layers  ; 
    var px = document.layers ? "" : "px"; 
    window[id + "_obj"] = el; 
    if(d.layers)el.style=el; 
    el.cx = el.sx = sx;el.cy = el.sy = sy; 
    el.sP=function(x,y){this.style.left=x+px;this.style.top=y+px;}; 
 
    el.floatIt=function() 
    { 
        var pX, pY; 
        pX = (this.sx >= 0) ? 0 : ns ? innerWidth :  
        document.documentElement && document.documentElement.clientWidth ?  
        document.documentElement.clientWidth : document.body.clientWidth; 
        pY = ns ? pageYOffset : document.documentElement && document.documentElement.scrollTop ?  
        document.documentElement.scrollTop : document.body.scrollTop; 
        if(this.sy<0)  
        pY += ns ? innerHeight : document.documentElement && document.documentElement.clientHeight ?  
        document.documentElement.clientHeight : document.body.clientHeight; 
        this.cx += (pX + this.sx - this.cx)/8; 
        this.cy += (pY + this.sy - this.cy)/8; 
        this.sP(this.cx, this.cy); 
        setTimeout(this.id + "_obj.floatIt()", 40); 
    } 
    return el; 
} 

JSFX("popin", -wtx2, htx2).floatIt(); 
//JSFX("popin", -wtx2*1.7, -htx2*5.5).floatIt(); 


Voici le fichier style.css pour donner un style à la pop-in :
#popin
{
	position : absolute ;
	border : 2px solid red;
	background-color : blue ;
	margin:0;
	width : 325px ;
	height : 400px ;
}



Pour rappel, je veux que ma pop-in arrive avec une animation, qu'elle soit centrée (et toujours centrée, même en redimmensionnant la fenêtre du navigateur).

La dernière ligne du fichier pop-in.js, c'est là où est le problème et donc peut-être la solution. Quand je change les deux dimensions, c'est là qu'on observe des changements. L'appel de la fonction comme ceci : JSFX("popin", -wtx2, htx2).floatIt(); a l'air de plus ou moins marcher mais ma pop-in n'est pas centré ! Par contre elle reste toujours aux mêmes positions du navigateur, peu importe si on le redimmensionne ou pas. Et si on met wtx2 et pas -wtx2, là la pop-in est centrée, mais pas quand je redimmensionne.

Voilà où j'en suis. Alors, si quelqu'un arrive à la fois à la centrer, même en cas de redimmensionnement, et avec l'animation, je suis preneur !

Romain
Modifié par rom117 (09 May 2010 - 22:45)
Ouf ! C'est bon, j'ai trouvé !

Pour ceux que ça intéressent, je me suis inspiré du code de cette page :
http://www.jtricks.com/javascript/navigation/floating.html.
J'ai juste changé les valeurs de targetX et targetY (nouvelles valeurs : center) et renommé la variable floatingMenuId pour l'adapter à mon div.

Merci encore pour ton aide Tony, et à la prochaine Smiley cligne .

Romain
Modifié par rom117 (10 May 2010 - 10:11)
Re salut !

Alors je viens de tout rechanger le code en fonction du lien que j'ai donné dans le post précédent.
Alors le centrage de la pop-in marche sous Firefox mais pas du tout sous IE (pour changer !).
J'ai stocké ici l'ensemble des pages que j'utilise : http://dis.univ-lyon2.fr/~rlalande/.
Ma page principale est en asp et le serveur sur lequel je l'ai mise ne permet pas de l'exécuter mais seulement de la télécharger ! Pour tester ce que donne mon code, il suffit de télécharger les 3 fichiers à la racine : test.asp, centrer_popin.js et style.css et de les lancer de chez soi.
Dans la page test.asp (celle qu'on doit lancer), il y a pleins d'éléments comme des cellules de tableau. Si je les enlève, un par un, petit à petit mon pop-in se décale vers le haut et n'est plus centré.

Pour résumer, mon code marche plus ou moins sous Firefox si je ne modifie rien, et il ne marche pas du tout sous IE ! Et j'aimerais comprendre Smiley decu !
A tester !

Si quelqu'un a des idées... je suis preneur ! Merci bien, Romain
Modifié par rom117 (17 May 2010 - 22:47)
Bon je vais mettre ce sujet résolu et en recréer un en mettant seulement mon dernier message, car si les gens lisent tous les messages, ils vont y passer du temps pour pas grand chose...
Pages :