<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapitre SYSTEM "../ressources/chapitre23.dtd">
<chapitre typecourssiteweb="dhtml">
	<cours nomfichier="window">Cours de JavaScript</cours>
	<entete>
		<titre>Le DOM: fenêtre, navigateur et interface-utilisateur</titre>
		<auteur email="Gilles.Chagnon@upmc.fr">G. Chagnon</auteur>
		<resume>Le DOM permet d'accéder et de manipuler une fenêtre, ainsi que les propriétés du navigateur et ses relations avec le système.</resume>
		<motsclefs>dhtml, dom, javascript, window, navigateur, fenêtre</motsclefs>
	</entete>
	<corpus>
		
		<partie titre="Introduction" ancre="windowintro">
			<paragraphe>
				<texte>Après avoir appris comment <reference href="modifs.html">manipuler les n&#339;uds d'un document</reference> dans un précédent chapitre, nous allons maintenant voir comment il est possible de modifier les propriétés de la fenêtre du navigateur contenant ce document. Nous verrons également comment manipuler l'historique du navigateur, ainsi que quelques méthodes permettant de réaliser les fonctions de base de l'interface entre l'homme et la machine.</texte>
			</paragraphe>
			<paragraphe>
			<texte>Toutes les propriétés et méthodes exposées dans ce chapitre sont appliquées à l'objet <code>window</code>.</texte>
			</paragraphe>
		</partie>
		
		<partie titre="La géométrie de la fenêtre et de l'écran" ancre="geometrie">
			<section titre="À l'extérieur de la fenêtre du navigateur" ancre="exterieur">
				<paragraphe titre="Taille de la fenêtre" ancre="taillefenetreexterieure">
					<texte>Deux propriétés et deux méthodes permettent d'ajuster précisément, au pixel près, la taille de la fenêtre courante.</texte>
					<liste>
						<item>
							<texte><code>outerHeight</code> et <code>outerWidth</code> permettent de spécifier respectivement la hauteur et la largeur de la fenêtre. Ces propriétés ne sont pas supportées par <logiciel lang="en">Internet Explorer</logiciel>.</texte>
						</item>
						<item>
							<texte>La méthode <code>resizeTo(width, height)</code> permet de modifier la taille de la fenêtre et lui attribuer une largeur <code>width</code> et une hauteur <code>height</code>, indiquées en nombre de pixels. Par exemple,</texte>
							<exemplejavascript>
								<instruction name="function "/><fonction name="moitie"></fonction>
								<bloc>
									<propriete name="window."/><fonction name="resizeTo"><propriete name="window.screen.availWidth/2"/><propriete name="window.screen.availHeight/2"/></fonction><finligne/>
								</bloc>
							</exemplejavascript>
							<texte>Sous Firefox, cette méthode ne permet de redimensionner qu'une fenêtre préalablement ouverte avec <code>window.open()</code>, et ne permet pas de redimensionner une fenêtre possédant plusieurs onglets. Sous Internet Explorer, cette méthode ne permet pas non plus de redimensionner une fenêtre possédant plusieurs onglets.</texte>
						</item>
						<item>
							<texte>La méthode <code>resizeBy(delta_width, delta_height)</code> permet de modifier la taille de la fenêtre par rapport à la taille précédente, et de modifier sa largeur de la quantité <code>delta_width</code> et sa hauteur de la quantité <code>delta_height</code>, indiquées en  nombre de pixels. Ces valeurs peuvent être négatives, ce qui a pour résultat une diminution de la taille de la fenêtre.</texte>
						</item>
					</liste>
				</paragraphe>
				<paragraphe titre="Comment déplacer la fenêtre&#160;?" ancre="deplacementfenetre">
					<texte>Deux méthodes sont utilisables&#160;: <code>moveBy(delta_x, delta_y)</code> déplace la fenêtre relativement à la position courante des quantités <code>delta_x</code> et <code>delta_y</code> respectivement horizontalement et verticalement, et <code>moveTo(x, y)</code> place le coin supérieur gauche de la fenêtre aux coordonnées <code>x</code> et <code>y</code> de la zone réservée à l'affichage sur l'écran.</texte>
				</paragraphe>
				<paragraphe titre="Comment positionner la fenêtre par rapport à la taille de l'écran?" ancre="positionecran">
					<texte>Donner une largeur à la fenêtre peut être inutile si on ne prend pas des précautions en tenant compte de la place disponible sur l'écran. Nous avons vu précédemment un exemple d'appel à une des propriétés le permettant&#160;; nous allons maintenant les examiner plus en détails.</texte>
					<texte>La taille de l'écran est accessible par six propriétés, qui bien sûr ne peuvent pas être modifiées.</texte>
					<liste>
						<item>
							<texte>Les informations sur l'écran et ce qui y est affichable peuvent être obtenues par les propriétés <code>window.screen.width</code> et <code>window.screen.height</code>.</texte>
						</item>
						<item>
							<texte>Cependant, cette taille n'est pas forcément égale à celle qui est effectivement disponible&#160;; le système d'exploitation réserve en effet certains espaces pour son interface (il peut s'agir d'une barre des tâches par exemple...). <code type="langage">JavaScript</code> définit ainsi quatre propriétés donnant ces dimensions&#160;:</texte>
							<liste>
								<item><texte><code>window.screen.availTop</code> et <code>window.screen.availLeft</code> donnent respectivement l'ordonnée du premier pixel disponible à partir du haut de l'écran et l'abscisse du premier pixel disponible à partir de la gauche de l'écran, mais ces propriétés ne sont pas supportées par <logiciel lang="en">Internet Explorer</logiciel>.</texte></item>
								<item><texte><code>window.screen.availHeight</code> et <code>window.screen.availWidth</code> donnent respectivement la hauteur et la largeur effectivement disponibles.</texte></item>
							</liste>
						</item>
					</liste>
					<texte>Cela étant établi, on peut modifier la position de la fenêtre du navigateur par rapport à l'écran en toute connaissance de cause. <code>window.screenX</code> et <code>window.screenY</code> fixent la position de la fenêtre par rapport respectivement aux bords gauche et supérieur de l'écran.</texte>
					<!--<liste>
						<item><texte><code>window.screenX</code> ou <code>window.screen.left</code> positionnent la fenêtre par rapport au bord gauche&#160;;</texte></item>
						<item><texte><code>window.screenY</code> ou <code>window.screen.top</code> positionnent la fenêtre par rapport au bord supérieur.</texte></item>
					</liste>-->
				</paragraphe>
			</section>
			<section titre="À l'intérieur de la fenêtre du navigateur" ancre="interieur">
				<paragraphe titre="Largeur et hauteur disponibles" ancre="largeurethauteurint">
					<texte><code>window.innerHeight</code> et <code>window.innerWidth</code> donnent respectivement la hauteur et la largeur disponibles à l'intérieur de la fenêtre pour l'affichage d'un document. Ces propriétés ne sont pas supportées par <logiciel>Internet Explorer</logiciel>.</texte>
					<texte><logiciel>Internet Explorer</logiciel> fournit les propriétés <code>document.body.clientHeight</code> et <code>document.body.clientWidth</code>. Ces propriétés sont supportées par <logiciel>Firefox</logiciel> à condition d'indiquer un type de document HTML Transitional. Elles renvoient, comme leur nom l'indique, les dimensions occupées par l'élément <code>body</code>.</texte>
				</paragraphe>
				<paragraphe titre="Place perdue à cause du défilement" ancre="placescrolling">
					<texte>Il est parfois nécessaire de faire défiler (<autrelangue type="en">scroll</autrelangue>) un document. Ce défilement fait varier la position du coin supérieur gauche de la partie visible du document par rapport à son «&#160;vrai&#160;» coin supérieur gauche. Deux propriétés, ne faisant pas partie de la spécification et malheureusement <valeur>non supportées</valeur> par <logiciel>Internet Explorer</logiciel> permettent de connaître la place perdue.</texte>
					<texte><code>window.pageXOffset</code> retourne le nombre de pixels perdus par le défilement vers la droite&#160;; <code>window.pageYOffset</code> retourne le nombre de pixels perdus par le défilement vers le bas.</texte>
				</paragraphe>
			</section>
			<exercice titre="Manipulations de la fenêtre" ancre="manipfenetre">
				<enonce href="exercices/exo11.html"/>
				<correction href="exercices/exo11cor.html"/>
			</exercice>
		</partie>
		
		<partie titre="Manipuler le navigateur et le système" ancre="navigateuretsysteme">
			<section titre="Informations sur le navigateur" ancre="infonavigateur">
				<paragraphe>
					<texte>On peut accéder à nombre d'informations sur le navigateur à l'aide de la collection <code>navigator</code> de l'objet <code>window</code>.</texte>
					<liste>
						<item><texte><code>window.navigator.appName</code> retourne le nom du navigateur.</texte></item>
						<item><texte><code>window.navigator.appVersion</code> retourne le numéro de version du navigateur ainsi que diverses informations sur le système.</texte></item>
						<item><texte><code>window.navigator.language</code> retourne la langue du navigateur. Cette propriété n'est pas supportée par <logiciel>Internet Explorer</logiciel>.</texte></item>
						<item><texte><code>window.navigator.platform</code> retourne la plateforme sur laquelle fonctionne le navigateur (dans le cas de Windows, la chaîne retournée est "Win32").</texte></item>
						<item><texte><code>window.navigator.product</code> retourne le nom du produit (dans le cas de Mozilla/FireFox, il s'agit de Gecko).</texte></item>
					</liste>
					<texte>On peut également savoir si le document rendu l'est en mode <reference href="http://www.quirksmode.org/css/quirksmode.html" lang="en"><autrelangue type="en">Quirks</autrelangue> ou <autrelangue type="en">Strict</autrelangue></reference> grâce à la propriété <code>document.compatMode</code> Dans le premier cas, la chaîne retournée est "<code>BackCompat</code>", dans le second "<code>CSS1Compat</code>".</texte>
				</paragraphe>
				<exercice titre="Informations sur le navigateur" ancre="exonavigateur">
					<enonce href="exercices/exo12.html"/>
					<correction href="exercices/exo12cor.html"/>
				</exercice>
			</section>
			<section titre="Informations sur le document" ancre="infodocument">
				<paragraphe>
					<texte>En faisant appel à la propriété <code>document.lastModified</code>, on a accès aux date et heure de dernière mise à jour sur le serveur.</texte>
				</paragraphe>
			</section>
			<section titre="Modification du document chargé" ancre="modifurl">
				<paragraphe titre="Accès à l'historique du navigateur" ancre="acchistorique">
					<texte>On peut simuler des clics sur les boutons «&#160;Suivant&#160; et «&#160;Précédent&#160;» du navigateur, par des appels respectivement à <code>window.history.forward()</code> et <code>window.history.back()</code>. Cependant, l'appel à ces méthodes constitue un doublon de ce que l'utilisateur sait déjà qu'il est possible de faire à l'aide de son navigateur, et leur usage doit donc se justifier (dans le cas de la disparition de la barre de navigation, par exemple).</texte>
					<liste>
						<item><texte><code>window.history.go(index)</code> permet de se déplacer en avant (avec un index positif) et en arrière (avec un index négatif) dans l'historique.</texte></item>
						<item><texte><code>window.history.length</code> donne le nombre d'URL stockées dans l'historique de la fenêtre courante.</texte></item>
						<item><texte><code>document.referrer</code> retourne l'URL de la page ayant lié à la page couramment affichée.</texte></item>
					</liste>
				</paragraphe>
				<paragraphe titre="Modification directe de l'URL du document chargé">
					<texte><code>window.location</code> donne et permet de spécifier l'URL du document chargé dans la fenêtre. La propriété <code>document.URL</code> joue un rôle similaire, à deux nuances près toutefois&#160;:</texte>
					<liste>
						<item><texte>pour <logiciel>Internet Explorer</logiciel>, la chaîne de caractères retournée par cette deuxième propriété, dans le cas d'un fichier local, fait apparaître des caractères "\" dans le chemin du fichier au lieu de caractères "/" (qui est la syntaxe normale pour une URL, même locale).</texte></item>
						<item><texte>pour <logiciel>Mozilla</logiciel>, cette propriété est en <valeur>lecture seule</valeur>, et ne peut donc pas servir à changer l'URL du document affiché.</texte></item>
					</liste>
					<texte><code>window.home()</code> renvoie à la page d'accueil du navigateur (non supportée par IE6).</texte>
				</paragraphe>
				<exercice titre="Historique" ancre="exohistorique">
					<enonce href="exercices/exo13.html"/>
					<correction href="exercices/exo13cor.html"/>
				</exercice>
			</section>
			<section titre="Gestion des fenêtres" ancre="gestionfenetres">
				<paragraphe titre="Fermeture d'une fenêtre&#160;: window.close()">
					<texte><code>window.close()</code> ferme la fenêtre courante. Les deux navigateurs principaux adoptent des politiques différentes afin de ne pas forcer le comportement de l'utilisateur. <logiciel>Internet Explorer</logiciel> demande une confirmation à l'aide d'une boîte de dialogue, <logiciel>Mozilla/FireFox</logiciel> refuse de fermer une fenêtre qui n'a pas été ouverte par un script. <logiciel>Opera</logiciel> quant à lui ferme la fenêtre sans préavis.</texte>
				</paragraphe>
				<paragraphe titre="Ouverture d'une nouvelle fenêtre&#160;: window.open()" ancre="popupsyntaxe">
					<texte>La création d'une nouvelle fenêtre est facile en <code type="langage">JavaScript</code>, mais il faut prendre garde à ce que cela ne soit pas perçu comme une intrusion par le visiteur du site. Bon nombre en effet souhaitent conserver le contrôle sur le nombre de fenêtres ouverts de leur navigateur. De plus, les utilisateurs d'aides techniques comme les synthèses vocales risquent de ne pas être averti ou de manquer le message de notification de l'ouverture de nouvelles fenêtres, ce qui perturbe leur navigation. Avec un minimum de précautions, il est néanmoins possible de ne léser ni surprendre personne, par exemple en indiquant explicitement dans l'intitulé du lien qu'il va s'ouvrir dans une nouvelle fenêtre.</texte>
					<texte>La méthode <code>window.open</code> prend plusieurs paramètres. Il y a deux paramètres obligatoires, et plusieurs paramètres facultatifs. La syntaxe minimale est <code>window.open(url,nom);</code> où <code>url</code> est une chaîne de caractères qui donne l'<abreviation titre="Uniform Resource Locator" lang="en">URL</abreviation> de la page à charger dans la nouvelle fenêtre, et <code>nom</code> un identifiant qui permet de retrouver une référence à la fenêtre. Les paramètres facultatifs sont&#160;:</texte>
					<liste>
						<item><texte><code>top</code> et <code>left</code>, qui précisent la position de la nouvelle fenêtre respectivement par rapport aux bords supérieur et gauche de l'écran, exprimée en pixels.</texte></item>
						<item><texte><code>outerHeight</code> et <code>outerWidth</code>, qui précisent la taille de la fenêtre d'affichage en pixels.</texte></item>
						<item><texte><code>height</code> et <code>width</code>, qui indiquent la taille de la zone d'affichage en pixels dans la nouvelle fenêtre.</texte></item>
						<item><texte><code>menubar</code>. La présence d'une barre de menu peut être désactivée en ajoutant <code>menubar=no</code>.</texte></item>
						<item><texte><code>toolbar</code>. La présence d'une barre d'outils peut être désactivée en ajoutant <code>toolbar=no</code>.</texte></item>
						<item><texte><code>location</code>. La présence de la zone de saisie de l'adresse peut être désactivée en ajoutant <code>location=no</code></texte></item>
						<item><texte><code>directories</code>, qui permet d'indiquer en spécifiant <code>directories=yes</code> que le navigateur doit afficher des informations dans un panneau latéral, ou bien dans une barre de menu. Dans le cas des navigateurs <logiciel>Netscape</logiciel>, il s'agit de la barre d'outils personnelle. <logiciel>FireFox</logiciel> affiche le panneau de marque-pages, <logiciel>Internet Explorer</logiciel> la liste des liens.</texte></item>
						<item><texte><code>status</code>. La présence d'une barre de statut peut être désactivée en ajoutant <code>status=no</code>.</texte></item>
						<item><texte><code>resizable</code>. Il est possible d'interdire le redimensionnement de la fenêtre en indiquant <code>resizable=no</code>.</texte></item>
						<item><texte><code>scrollbars</code>. Il est possible d'interdire la présence des barres de défilement en indiquant <code>scrollbars=no</code>.</texte></item>
						<item><texte><code>dependent</code> permet de spécifier que la nouvelle fenêtre est dépendante de la fenêtre à partir de laquelle elle a été ouverte en indiquant <code>dependent=yes</code>. Dans ce cas, si la fenêtre mère est fermée, la nouvelle fenêtre est elle aussi automatiquement fermée.</texte></item>
					</liste>
					<texte>Il est possible de trouver sur Internet des exemples de scripts permettant l'ouverture de nouvelles fenêtres, qui ne soient pas des obstacles à l'accessibilité. Voici par exemple comme réaliser un <reference href="http://www.allhtml.com/articles/detail/593">popup accessible avec un bouton de fermeture</reference>.</texte>
				</paragraphe>
				<paragraphe titre="Relation entre deux fenêtres" ancre="relationfenetres">
					<texte>Lorsqu'une fenêtre en ouvre une autre, cette information n'est pas perdue pour la seconde. La référence à la fenêtre ouvrante peut être récupérée par la propriété <code>window.opener</code>. Par exemple, si on écrit <code>fenetre_ouvrante=window.opener</code>, l'objet <code>fenetre_ouvrante</code> est alors utilisable et modifiable (par exemple, par <code>fenetre_ouvrante.location(...)</code>).</texte>
					<texte>Dans le cas d'un document ouvert dans un <autrelangue type="en">frame</autrelangue>, il est possible d'avoir accès au <autrelangue type="en">frame</autrelangue> parent, par <code>window.parent</code>.</texte>
				</paragraphe>
			</section>
		</partie>
		
		<partie titre="Gestion de l'interface utilisateur" ancre="gestioninterface">
			<section titre="Émuler les boutons «&#160;Arrêter&#160;» et «&#160;Imprimer&#160;»" ancre="arretimprime">
				<paragraphe>
					<texte>Deux méthodes facilitent un certain nombre de manipulations, ou bien guident l'utilisateur dans ses opérations, et s'appliquent à l'objet <code>window</code>.</texte>
					<liste>
						<item><texte><code>window.stop()</code> équivaut au clic sur le bouton d'arrêt de chargement de la page par l'utilisateur. En raison de l'ordre de gestion des priorités, l'appel à cette méthode stoppera le chargement des grandes images, des nouvelles fenêtres éventuellement ouvertes et des autres grands objets.</texte></item>
						<item><texte><code>window.print()</code> lance la boîte de dialogue d'impression standard pour le système d'exploitation pour la fenêtre courante.</texte></item>
					</liste>
				</paragraphe>
			</section>
			<section titre="Dialoguer avec l'utilisateur" ancre="discussion">
				<paragraphe>
					<texte>Il est bien sûr possible de <reference href="#popup">créer une fenêtre</reference>, dotée de boutons divers offrant à l'utilisateur des choix entre plusieurs options. Mais il est souvent inutile d'avoir recours à une telle lourdeur&#160;: les méthodes <code>window.alert(chaine)</code> et <code>resultat=window.confirm(chaine)</code> permettant respectivement d'afficher un message d'information, ou bien d'ouvrir une boîte avec une demande de confirmation. <code>resultat</code> est un booléen qui vaut <code>true</code> si l'utilisateur a cliqué sur OK, et <code>false</code> s'il a cliqué sur Annuler. Enfin, <code>window.prompt(chaine)</code> affiche une boîte de saisie&#160;:</texte>
					<liste>
						<item><texte><code>window.alert(chaine)</code> affiche à l'écran le message d'information contenu dans <code>chaine</code>. Dans la boîte ne se trouve qu'un bouton <code>OK</code>.</texte></item>
						<item><texte><code>window.confirm(chaine)</code> affiche la chaîne de caractères <code>chaine</code> accompagnée de deux boutons <code>OK</code> et <code>Annuler</code>. Cette méthode renvoie un booléen qui vaut <code>true</code> si OK a été cliqué, et <code>false</code> si l'utilisateur a cliqué sur <code>Annuler</code>.</texte></item>
						<item><texte><code>window.prompt(chaine)</code> affiche la chaîne de caractères <code>chaine</code> puis une champ de saisie. La méthode retourne sous la forme d'une chaîne de caractères le résultat de la saisie de l'utilisateur. Si l'on souhaite traiter cette sortie comme un nombre, il est nécessaire de passer par une fonction de conversion de type, comme <code>parseFloat</code> ou <code>parseInt</code>. Par exemple, <code>quantite=parseFloat(prompt("Entrez la quantité souhaitée :"));</code>. Cette méthode n'est maintenant <reference href="http://www.hunlock.com/blogs/Working_around_IE7s_prompt_bug,_er_feature">plus supportée par <logiciel lang="en">Internet Explorer&#160;7</logiciel></reference>.</texte></item>
					</liste>
					<texte>Enfin, la propriété <code>window.status</code> donne accès au texte affiché dans la barre de statut en bas de la fenêtre du navigateur (par défaut, l'accès à cette fonctionnalité est désactivé sous <logiciel>FireFox</logiciel> et sous <logiciel>Internet Explorer&#160;7</logiciel>).</texte>
				</paragraphe>
			</section>
			<section titre="Gestion des cookies" ancre="cookies">
				<paragraphe>
					<texte>On peut créer et manipuler des <autrelangue type="en">cookies</autrelangue> grâce à la collection <code>document.cookie</code>.</texte>
				</paragraphe>
			</section>
			<section titre="Faire défiler l'affichage" ancre="scrolling">
				<paragraphe>
					<texte>Le <autrelangue type="en">scrolling</autrelangue>, ou défilement, permet l'exploration d'une page&#160;; fournir des boutons permettant de le faire automatiquement <valeur>peut</valeur> être plus convivial que l'utilisation des barres des navigateurs.</texte>
					<liste>
						<item><texte>La méthode <code>window.scroll(x, y)</code>, équivalente de la méthode <code>window.scrollTo(x, y)</code>, permet de faire défiler l'affichage jusqu'au point de coordonnées <code>x, y</code>.</texte></item>
						<item><texte>La méthode <code>window.scrollBy(x_delta, y_delta)</code> permet de faire défiler des quantités <code>delta_x</code> horizontalement et <code>delta_y</code> verticalement, par rapport à la position courante.</texte></item>
						<item><texte><code>window.scrollByLines(nombre_de_lignes)</code> et <code>window.scrollByPages(nombre_de_pages)</code> permettent de faire défiler l'affichage respectivement d'un nombre déterminé de lignes ou de pages. Ces propriétés ne sont pas supportées par <logiciel>Internet Explorer</logiciel>.</texte></item>
					</liste>
				</paragraphe>
			</section>
		</partie>
		
	</corpus>
</chapitre>
