OVH Cloud OVH Cloud

Variables globales ?

7 réponses
Avatar
david P.
Bonjour à tous,

J'ai un document html avec deux frames qui elle-même sont un document html
et un document SVG. J'ai un fichier de script que j'ai déclaré au niveau de
la page contenant le document SVG. Ce fichier de script "fichier1.js"
initialise des variables globales. Comment puis-je atteindre ces memes
variables globales à partir de mon document html auquel j'ai associé un
autre fichier de script "fichier2.js" et qui est contenu dans une autre
frame.
Car pour l'instant, j'ai plutôt l'impression que les variables globales sont
globales à un script et donc deux scripts n'utilise pas la même zone de
données mémoires.

Merci par avances de vos réponses...

7 réponses

Avatar
Thibault TAILLANDIER
Bonjour à tous,

J'ai un document html avec deux frames qui elle-même sont un document html
et un document SVG. J'ai un fichier de script que j'ai déclaré au niveau de
la page contenant le document SVG. Ce fichier de script "fichier1.js"
initialise des variables globales. Comment puis-je atteindre ces memes
variables globales à partir de mon document html auquel j'ai associé un
autre fichier de script "fichier2.js" et qui est contenu dans une autre
frame.
Car pour l'instant, j'ai plutôt l'impression que les variables globales sont
globales à un script et donc deux scripts n'utilise pas la même zone de
données mémoires.

Merci par avances de vos réponses...




Bonjour,

Pour déclarer des variables globals, 2 solutions selon moi :
- La "propre": Pour déclarer des variables accessibles via toutes les
frames/iframes de ta page, il suffit de placer des variables dans le
scope (zone de déclaration) de la frame la plus haute : la top window.
Exemple :
dans index.html: var top.tutu = "Hello World";
dans fichier2.js: alert(top.tutu); // => "Hello World";

- La "moins propre": Ne pas utiliser le statement "var".
Ce n'est pas conseillé, voire meme pas toujours autorisé par les
debugger javascript (Ex: la console Firefox met des warnings), mais si
on ne met pas ce statement, les variables ont un scope global et sont
donc accesibles par toutes les autres frames y compris les frames parent.

Voilà. Sert-en bien pour que cela ne fasse pas du code trop éparpillé :-)
Bye
--
Thibault

Avatar
david P.
Si je comprends bien il suffit d'ajouter une zone script où on déclare ces
variables dans le fichier html contenant le frameset ?
Voilà ce que j'ai fait mais ça pas l'air de marcher !!! :
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script>
var SVG_DOC=null, SVG_ROOT=null;

var SCRWIDTH, SCRHEIGHT, F_SCALE, F_XSCALE, F_YSCALE, F_MIDX, F_MIDY;
var FORIG_X, FORIG_Y, FORIG_WIDTH, FORIG_HEIGHT;
var F_CURX, F_CURY, F_CURWIDTH, F_CURHEIGHT, F_ZOOMFACT=1.5;

var OTXT_TOOLTIP=null, I_NBLIG = 1, I_MARGE = 5, B_TOOLTIP = true,
B_HIGHLIGHT=true;
var O_BEFORE=null, FILLCUR="none", FILLOPA = "1";
var STR_COMPOSEL="", I_ATTSEL=-1, STR_ATTSEL="";
var X1, Y1, B_ZOOMCADREúlse, B_PANúlse;
var QSTR="", B_3Kúlse, O_3K=null, O_SRC=null, O_DST=null,
FILLSRC_3K="none", FILLDST_3K="none";
</script>
</head>

<frameset rows="143,*,23" cols="*" frameborder="no" border="0"
framespacing="0" >
<frame src="Toolbar.html" name="ToolBar" scrolling="no">
<frame src="modeleSVG_Frame.html" name="SVG" scrolling="no"
frameborder="0" marginwidth="0" marginheight="0" >
</frameset>
<noframes>
<body>
</body>
</noframes>
</html>

"Thibault TAILLANDIER" a écrit dans le
message de news: 4278ca89$0$307$
Bonjour à tous,

J'ai un document html avec deux frames qui elle-même sont un document
html et un document SVG. J'ai un fichier de script que j'ai déclaré au
niveau de la page contenant le document SVG. Ce fichier de script
"fichier1.js" initialise des variables globales. Comment puis-je
atteindre ces memes variables globales à partir de mon document html
auquel j'ai associé un autre fichier de script "fichier2.js" et qui est
contenu dans une autre frame.
Car pour l'instant, j'ai plutôt l'impression que les variables globales
sont globales à un script et donc deux scripts n'utilise pas la même zone
de données mémoires.

Merci par avances de vos réponses...


Bonjour,

Pour déclarer des variables globals, 2 solutions selon moi :
- La "propre": Pour déclarer des variables accessibles via toutes les
frames/iframes de ta page, il suffit de placer des variables dans le scope
(zone de déclaration) de la frame la plus haute : la top window. Exemple :
dans index.html: var top.tutu = "Hello World";
dans fichier2.js: alert(top.tutu); // => "Hello World";

- La "moins propre": Ne pas utiliser le statement "var".
Ce n'est pas conseillé, voire meme pas toujours autorisé par les
debugger javascript (Ex: la console Firefox met des warnings), mais si on
ne met pas ce statement, les variables ont un scope global et sont donc
accesibles par toutes les autres frames y compris les frames parent.

Voilà. Sert-en bien pour que cela ne fasse pas du code trop éparpillé :-)
Bye
--
Thibault



Avatar
Thibault TAILLANDIER

Pour déclarer des variables globals, 2 solutions selon moi :
- La "propre": Pour déclarer des variables accessibles via toutes les
frames/iframes de ta page, il suffit de placer des variables dans le scope
(zone de déclaration) de la frame la plus haute : la top window. Exemple :
dans index.html: var top.tutu = "Hello World";
dans fichier2.js: alert(top.tutu); // => "Hello World";




Si je comprends bien il suffit d'ajouter une zone script où on
déclare ces

variables dans le fichier html contenant le frameset ?
Voilà ce que j'ai fait mais ça pas l'air de marcher !!! :


Peux-tu nous donner aussi les endroits ou tu appele les variables ?

Merci
--
Thibault


Avatar
david P.
entete du fichier de la première frame :
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"
/>
<script language="JavaScript" src="../toolbar.js"></script>
</head>

<body topmargin="0" leftmargin="0">
<table id="toolbar" width="100%" border=".3" cellpadding="2" cellspacing="0"
bgcolor="darkorange">
...
<img align="middle" alt="Zoom +" border=".1" src="./img/ihm/zoomin.gif"
width="20" height="20" onclick="ZoomIn()">
...

2e frame :
...
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"
/>
<script language="JavaScript" src="../geooutweb.js"></script>
<script language="JavaScript" src="test_export_2_data.js"></script>
</head>

<body topmargin="0" leftmargin="0">
<embed name="mapSVG" width="100%" height="100%" src="test_export_2.svg"
type="image/svg+xml">
</embed>
</body>
...

dans geooutweb.js :
function SVGInitialize(load_evt)
{
var o_map, o_gelement, tmp, i, j=0;
//alert("SVGInitialize");
//Récupération du document SVG et du premier élément de l'arbre SVG.
SVG_DOC = load_evt.target.ownerDocument;
SVG_ROOT = SVG_DOC.documentElement;
OTXT_TOOLTIP =
SVG_DOC.getElementById("tooltip").getElementsByTagName("text");
o_map = SVG_DOC.getElementById("Map");

if(navigator.appName == "Microsoft Internet Explorer")
{
SCRWIDTH = parseFloat(document.body.clientWidth);
//SCRHEIGHT = (parseFloat(document.body.clientHeight) - 76); // 38 :
hauteur de la toolbar.
SCRHEIGHT = parseFloat(document.body.clientHeight);
}
else
{
SCRWIDTH = parseFloat(top.window.innerWidth);
SCRHEIGHT = parseFloat(top.window.innerHeight);
}

// Récupération de la viewbox définissant le SVG.
a_vb = o_map.getAttribute("viewBox").split(" ");
FORIG_X = F_CURX = parseFloat(a_vb[0]);
FORIG_Y = F_CURY = parseFloat(a_vb[1]);
FORIG_WIDTH = F_CURWIDTH = parseFloat(a_vb[2]);
FORIG_HEIGHT = F_CURHEIGHT = parseFloat(a_vb[3]);
ComputeCentrePoint();
//alert(FORIG_X+" "+FORIG_Y+" "+FORIG_WIDTH+" "+FORIG_HEIGHT);
F_XSCALE = parseFloat(F_CURWIDTH / SCRWIDTH);
F_YSCALE = parseFloat(F_CURHEIGHT / SCRHEIGHT);
//alert(F_XSCALE+" "+F_YSCALE);
if(F_XSCALE < F_YSCALE)
{
F_SCALE = F_YSCALE;
}
else
{
F_SCALE = F_XSCALE;
}
}

dans toolbar.js :
function ZoomIn()
{
var o_map, svg_doc;
//alert("ZoomIn");
svg_doc = top.window.frames[1].document.embeds[0].getSVGDocument();
o_map = svg_doc.getElementById("Map");

F_CURWIDTH = (F_CURWIDTH / F_ZOOMFACT);
F_CURHEIGHT = (F_CURHEIGHT / F_ZOOMFACT);

F_CURX = F_MIDX - (F_CURWIDTH / 2);
F_CURY = F_MIDY - (F_CURHEIGHT / 2);

o_map.setAttribute("viewBox",F_CURX+" "+F_CURY+" "+F_CURWIDTH+"
"+F_CURHEIGHT);

F_XSCALE = parseFloat(F_CURWIDTH / SCRWIDTH);
F_YSCALE = parseFloat(F_CURHEIGHT / SCRHEIGHT);
if(F_XSCALE < F_YSCALE)
{
F_SCALE = F_YSCALE;
}
else
{
F_SCALE = F_XSCALE;
}
}


"Thibault TAILLANDIER" a écrit dans le
message de news: 4278d337$0$295$

Pour déclarer des variables globals, 2 solutions selon moi :
- La "propre": Pour déclarer des variables accessibles via toutes les
frames/iframes de ta page, il suffit de placer des variables dans le
scope (zone de déclaration) de la frame la plus haute : la top window.
Exemple :
dans index.html: var top.tutu = "Hello World";
dans fichier2.js: alert(top.tutu); // => "Hello World";



Si je comprends bien il suffit d'ajouter une zone script où on
déclare ces

variables dans le fichier html contenant le frameset ?
Voilà ce que j'ai fait mais ça pas l'air de marcher !!! :


Peux-tu nous donner aussi les endroits ou tu appele les variables ?

Merci
--
Thibault




Avatar
Thibault TAILLANDIER
[...]

A quel moment à tu apppliqué l'une ou l'autre des méthodes que j'ai cité ?
Parce que je ne les ai pas vu.
Je me demande si les deux méthodes ne doivent pas être appliquées pour
que ca marche en fin de compte ...

Dans ton geooutweb.js, il faut que tu appelles tes variables via :
top.SVG_DOC = load_evt.target.ownerDocument;
top.SVG_ROOT = SVG_DOC.documentElement;

Et si ca ne marche toujours pas, essaie
de ne pas déclarer les varibles avec "var" dans le frameset :
SVG_DOC=null;
SVG_ROOT=null;
..

Bye
--
Thibault
Avatar
YD

dans geooutweb.js :
function SVGInitialize(load_evt)
{
var o_map, o_gelement, tmp, i, j=0;
//alert("SVGInitialize");
//Récupération du document SVG et du premier élément de l'arbre SVG.
SVG_DOC = load_evt.target.ownerDocument;
SVG_ROOT = SVG_DOC.documentElement;
OTXT_TOOLTIP =
SVG_DOC.getElementById("tooltip").getElementsByTagName("text");
o_map = SVG_DOC.getElementById("Map");

[...]

// Récupération de la viewbox définissant le SVG.
a_vb = o_map.getAttribute("viewBox").split(" ");
[...]


Si j'ai bien compris, tu essaies d'adresser l'arbre du document SVG via DOM.

Quel plugin et quelle version de ce plugin utilises-tu ? Peu offrent la
possibilité d'interaction entre les scripts du SVG et ceux de la page HTML,
et les versions évoluant, même Adobe SVG Viewer restreint (par sécurité je
crois) ces possibilités.

--
Y.D.

Avatar
david P.
merci je vais essayer tous ça !!!

"david P." a écrit dans le message de news:
4278d698$0$3131$
entete du fichier de la première frame :
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"
/>
<script language="JavaScript" src="../toolbar.js"></script>
</head>

<body topmargin="0" leftmargin="0">
<table id="toolbar" width="100%" border=".3" cellpadding="2"
cellspacing="0" bgcolor="darkorange">
...
<img align="middle" alt="Zoom +" border=".1" src="./img/ihm/zoomin.gif"
width="20" height="20" onclick="ZoomIn()">
...

2e frame :
...
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"
/>
<script language="JavaScript" src="../geooutweb.js"></script>
<script language="JavaScript" src="test_export_2_data.js"></script>
</head>

<body topmargin="0" leftmargin="0">
<embed name="mapSVG" width="100%" height="100%" src="test_export_2.svg"
type="image/svg+xml">
</embed>
</body>
...

dans geooutweb.js :
function SVGInitialize(load_evt)
{
var o_map, o_gelement, tmp, i, j=0;
//alert("SVGInitialize");
//Récupération du document SVG et du premier élément de l'arbre SVG.
SVG_DOC = load_evt.target.ownerDocument;
SVG_ROOT = SVG_DOC.documentElement;
OTXT_TOOLTIP =
SVG_DOC.getElementById("tooltip").getElementsByTagName("text");
o_map = SVG_DOC.getElementById("Map");

if(navigator.appName == "Microsoft Internet Explorer")
{
SCRWIDTH = parseFloat(document.body.clientWidth);
//SCRHEIGHT = (parseFloat(document.body.clientHeight) - 76); // 38 :
hauteur de la toolbar.
SCRHEIGHT = parseFloat(document.body.clientHeight);
}
else
{
SCRWIDTH = parseFloat(top.window.innerWidth);
SCRHEIGHT = parseFloat(top.window.innerHeight);
}

// Récupération de la viewbox définissant le SVG.
a_vb = o_map.getAttribute("viewBox").split(" ");
FORIG_X = F_CURX = parseFloat(a_vb[0]);
FORIG_Y = F_CURY = parseFloat(a_vb[1]);
FORIG_WIDTH = F_CURWIDTH = parseFloat(a_vb[2]);
FORIG_HEIGHT = F_CURHEIGHT = parseFloat(a_vb[3]);
ComputeCentrePoint();
//alert(FORIG_X+" "+FORIG_Y+" "+FORIG_WIDTH+" "+FORIG_HEIGHT);
F_XSCALE = parseFloat(F_CURWIDTH / SCRWIDTH);
F_YSCALE = parseFloat(F_CURHEIGHT / SCRHEIGHT);
//alert(F_XSCALE+" "+F_YSCALE);
if(F_XSCALE < F_YSCALE)
{
F_SCALE = F_YSCALE;
}
else
{
F_SCALE = F_XSCALE;
}
}

dans toolbar.js :
function ZoomIn()
{
var o_map, svg_doc;
//alert("ZoomIn");
svg_doc = top.window.frames[1].document.embeds[0].getSVGDocument();
o_map = svg_doc.getElementById("Map");

F_CURWIDTH = (F_CURWIDTH / F_ZOOMFACT);
F_CURHEIGHT = (F_CURHEIGHT / F_ZOOMFACT);

F_CURX = F_MIDX - (F_CURWIDTH / 2);
F_CURY = F_MIDY - (F_CURHEIGHT / 2);

o_map.setAttribute("viewBox",F_CURX+" "+F_CURY+" "+F_CURWIDTH+"
"+F_CURHEIGHT);

F_XSCALE = parseFloat(F_CURWIDTH / SCRWIDTH);
F_YSCALE = parseFloat(F_CURHEIGHT / SCRHEIGHT);
if(F_XSCALE < F_YSCALE)
{
F_SCALE = F_YSCALE;
}
else
{
F_SCALE = F_XSCALE;
}
}


"Thibault TAILLANDIER" a écrit dans le
message de news: 4278d337$0$295$

Pour déclarer des variables globals, 2 solutions selon moi :
- La "propre": Pour déclarer des variables accessibles via toutes les
frames/iframes de ta page, il suffit de placer des variables dans le
scope (zone de déclaration) de la frame la plus haute : la top window.
Exemple :
dans index.html: var top.tutu = "Hello World";
dans fichier2.js: alert(top.tutu); // => "Hello World";



Si je comprends bien il suffit d'ajouter une zone script où on
déclare ces

variables dans le fichier html contenant le frameset ?
Voilà ce que j'ai fait mais ça pas l'air de marcher !!! :


Peux-tu nous donner aussi les endroits ou tu appele les variables ?

Merci
--
Thibault