11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour !

je souhaite faire un économiseur de page pour mettre en veille un site lorsque la souris n'est pas utilisée depuis un moment. J'utilise l'évènement onmousemove pour ça.


function mousePosition(e){
	var posx = 0;
	var posy = 0;
	if (e == "alert") {
		document.getElementById('toto').innerHTML = "55555555555555555555555555";
		return;
	}
//	else if (typeof this.delay_before_screensaver != 'undefined') {
		clearInterval(delay_before_screensaver);
	}
	if (!e) var e = window.event;
	if (e.pageX || e.pageY){
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY){
		posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
	document.getElementById('toto').innerHTML = posx + " " + posy;
	if (typeof this.delay_before_screensaver == 'undefined') {
		this.delay_before_screensaver = setInterval ("mousePosition(\"alert\")", 800);
	}
}


et

<body onmousemove="javascript:mousePosition(event);">


je pensais que la ligne commentée permet de stopper le "compteur" quand on bouge la souris avant que le temps limite soit écoulé. Mais ça marche pas..
Modifié par ChrisG (08 May 2007 - 01:48)
Question préambule : quel est l'utilité d'un tel script ? Perso ce serait le genre de truc à me faire fuir...
Salut,

hou la quand je vois un script comme ça je mesure les grands vides dans mes connaissances javascript.

question (aprés avoir été un peu me renseigner): comment les appels successifs de la fonction mouseposition par setInterval pourrait-il passer dans ton else if puisque tu vas toujours passer en argument "alert"?

le clearInterval ne doit pouvoir arreter que les setInterval qui l'ont lancer.

je dirais de tenter le meme if sans le else avant?

-----------------------------------------------------------

sinon je trouve que tu te lances dans un truc ambitieux.

bien sûr ça peut-être fun d'introduire des animations flash ou gif pour accueillir l'utilisateur qui revient. et c'est surement assez innovant.

ça peut être encore une nouvelle sorte de ... ( un nom en 3 lettres que je deteste mais qu'on voit souvent sur internet ou a la télé )

Mais

faisons nous l'avocat de l'utilisateur bougon Smiley fache . (qui a dis que ça me collais comme un gant Smiley confus bon un peu Smiley langue )

- attention surtout a pas déclenché ça au bout de 15 secondes, voir 1 minute pk l'utilisateur peut etre vite (trés vite) lassé

- ça doit necessiter pas mal de ressources. quand l'utilisateur reviens ca risque de générer des lenteurs quand il reprend la main.

- tu risques de générer des erreurs "inutiles".

- tu risques d'entrer en conflit avec les économiseurs d'écrans du système.

- d'ailleurs si un utilisateur a desactiver le sien c a priori qu'il n'en veux pas. n'as-t-on pas banni des dtd strict le _blank car il ne respecte pas le choix de l'utilisateur.

bon malgré tous ( si je t'ai pas découragé )

bon courage

pascal.
Modifié par CPascal (07 May 2007 - 23:20)
QuentinC a écrit :
Question préambule : quel est l'utilité d'un tel script ? Perso ce serait le genre de truc à me faire fuir...


Tu veux que je demande à mon patron quel es l'intérêt d'un tel script !?
C'est une super idée d'un DA pour le nouveau site de leur boite de com, mais j'en ai déjà trop dit.
Smiley smile
Merci Pascal, ton intervention est très interessante, je vais prendre le temps de répondre !

CPascal a écrit :

question (aprés avoir été un peu me renseigner): comment les appels successifs de la fonction mouseposition par setInterval pourrait-il passer dans ton else if puisque tu vas toujours passer en argument "alert"?


en fait dans le code l'argument alert n'est pas toujours passé, quand on bouge la souris (onmousemove) on appelle mouseposition(event) donc pas de "alert"

CPascal a écrit :

le clearInterval ne doit pouvoir arreter que les setInterval qui l'ont lancer.


en fait le setInterval est mis dans la variable delay_before_screensaver or le clearInterval arrête seulement le compteur lié à cette variable donc il y a qu'un seul setInterval qui est lancé.

Mais le truc qui est interessant ici c'est qu'il y a une variable protégée, que l'on déclare grâce au mot clef "this.".


CPascal a écrit :

je dirais de tenter le meme if sans le else avant?


merci, c'est pas ça mais j'ai trouvé le soucis : le else if est une condition rempie la deuxième fois que la fonction est appelée : la variable protégée n'est plus 'undefined' donc on supprime le compteur et le compteur n'est plus relancé car à l'origine celui-ci est crée que lorsque la variable protégée n'existe pas.


CPascal a écrit :

sinon je trouve que tu te lances dans un truc ambitieux.

bien sûr ça peut-être fun d'introduire des animations flash ou gif pour accueillir l'utilisateur qui revient. et c'est surement assez innovant.

ça peut être encore une nouvelle sorte de ... ( un nom en 3 lettres que je deteste mais qu'on voit souvent sur internet ou a la télé )

Mais

faisons nous l'avocat de l'utilisateur bougon Smiley fache . (qui a dis que ça me collais comme un gant Smiley confus bon un peu Smiley langue )

- attention surtout a pas déclenché ça au bout de 15 secondes, voir 1 minute pk l'utilisateur peut etre vite (trés vite) lassé

- ça doit necessiter pas mal de ressources. quand l'utilisateur reviens ca risque de générer des lenteurs quand il reprend la main.

- tu risques de générer des erreurs "inutiles".

- tu risques d'entrer en conflit avec les économiseurs d'écrans du système.

- d'ailleurs si un utilisateur a desactiver le sien c a priori qu'il n'en veux pas. n'as-t-on pas banni des dtd strict le _blank car il ne respecte pas le choix de l'utilisateur.

bon malgré tous ( si je t'ai pas découragé )

bon courage

pascal.


En fait non, ce n'est pas de la pub, je n'aime pas les "malware" et l'économiseur est juste un "économiseur de page" qui lance l'apparition d'une "div" qui se place devant les autres éléments de la page et qui est transparente et foncée.

le code qui marche

function screen_saver(e){
	if (e == "activation") {
		clearInterval(delay_before_screensaver);
		var sp = document.createElement('div');
		sp.id = "saver";
		document.getElementsByTagName('body')[0].appendChild(sp);
		document.getElementsByTagName('body')[0].hasScreenSaver = sp;
		return;
	}
	else if (typeof this.delay_before_screensaver != 'undefined') {
		clearInterval(delay_before_screensaver);
		if (document.getElementsByTagName('body')[0].hasScreenSaver) {
			the_div = document.getElementById('saver');
			the_div.parentNode.removeChild(the_div);
			document.getElementsByTagName('body')[0].hasScreenSaver = null;
		}
		this.delay_before_screensaver = setInterval ("screen_saver(\"activation\")", 3000);
	}
	if (typeof this.delay_before_screensaver == 'undefined') {
		this.delay_before_screensaver = setInterval ("screen_saver(\"activation\")", 3000);
	}
}
window.onload = window.onmousemove = screen_saver;

Modifié par ChrisG (08 May 2007 - 01:47)
Bonjour,

j'essai de faire marcher mon script sur IE, j'ai constaté que sur le premier script posté ici, sur IE on voit meme pas les coordonnées de la souris, comme si l'évènement onmousemove sur <body> ne marche pas.