11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
je travaille actuellement sur une application riche, celle ci faisant régulièrement une requête sur le serveur à intervalle régulier, je souhaiterais vérifier que l'onglet du navigateur qu'utilise l'utilisateur est bien celui de mon application. Si l'onglet est actif la requête asynchrone se fait toutes les 3 seconde, si ce n'est pas le cas, toutes les 10-15 secondes, afin d'économiser les ressources du serveurs, ou d'éviter qu'un utilisateur sature le serveur en ayant plusieurs onglets ouvert vers mon application.

Donc voici mon script en javascript :


//cette fonction est appelé depuis l'element body avec l'attribut onload.
function focusMovie(){
	window.focus(); //ceci ne marche pas sur chrome.
	document.getElementById("website").focus(); //ceci donne le focus à un element embed ou object, contenant un fichier SWF.
			
var _isActive = false;

//cette fonction est appelé depuis mon SWF via ExternalInterface.
function isActive(){
	return _isActive;
}
		
function onBlur() {
	_isActive = false;
}
			
function onFocus(){
	_isActive = true;
}

//on verifie qu'on est sous IE ou non.			 
if (/*@cc_on!@*/false) {
	document.onfocusin = onFocus;
	document.onfocusout = onBlur;
} else {
	window.onfocus = onFocus;
	window.onblur = onBlur;
}


Au démarage, chrome ne lance pas d'évènement focus, forcer le passage avec window.focus() ne fonctionne pas.

Sous firefox et IE, l'évènement blur ne se déclenche qu'en sortant de la fenêtre pas en changeant d'onglet. Sous opéra et chrome, ça passe.

Dans le else si je remplace window.onfocus par document.onfocus, et idem pour l'évènement blur, j'ai le comportement désiré dans firefox et opera (le blur au changement d'onglet), mais tout déraille sous chrome.

Pour IE je n'ai rien qui marche vraiment comme souhaité.

Quelqu'un aurait-il déjà été confronté à ce genre de problème, et aurait-il trouver une solution ?
Merci d'avance pour votre aide et toute optimisation que je pourrais apporter à ce code.
Salut jun.in.mess,

j'ai été confronté à ce genre de problème il y a peu, et j'ai utilisé 2 manières différentes pour gérer la chose :

1. Si Le contenu de l'onget est dans un div, avant d'effectuer l'action test si le div est visible. Avec prototype sa donne un truc du genre : if( $('mon_div').style.display != 'none') enfin je crois Smiley smile (la récupération du style n'est pas propre à prototype, tu peux le faire a partir de n'importe quel élément javascript)
2. les requests sont effectuées toutes les n secondes grâce à un setInterval, donc tu peux faire un clearInterval dès qu'il y a un clic sur un autre onglet que celui que tu souhaite, puis a nouveau un setInterval pour le bon onglet.

Voilà, j'espère que sa t'aidera
Modifié par Mikerob (19 Jan 2009 - 17:17)
@Mikerob
Merci de ta participation, mais dans ton empressement tu as du manquer un détails. Je parle ici des onglet du navigateurs et non pas de ceux d'un élément de navigation au sein de ma page.

Merci tout de même pour l'attention que tu as porté à ma question.
ah effectivement, j'ai pas vu que tu parlais du navigateur Smiley biggol

Ben là je sais pas trop quoi te dire... Ou alors est-ce que par hazard tu pourrais pas utiliser onmouseover / onmouseout sur un div qui entourerait ton application ? (voir sur le body mais je sais pas s'il y c'est vraiment supporté...)

Sorry pour ma mauvaise vue Smiley smile