Changer l'ID d'une balise si une page http existe

Signaler
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
-
dhaze
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020
-
Bonjour,

J'ai parcouru le web sur le thème "javascrip ping" et je n'ai trouvé que des usines à gaz
alors que je souhaitais une chose toute simple (dans la mesure où c'est possible).
On teste l'existence d'une page et si c'est le cas on change l'ID de la balise DIV.

Il y a aussi un phénomène étrange, au bout d'un moment setInterval semble s’emballer,
et la boucle devient tellement rapide que cela bloque IE...

Merci.
Lo.

<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<style type="text/css">
div#img_OFF {background-image: url('img/OFF.png');display:block;width:66px;height:57px;}
div#img_ON {background-image: url('img/ON.png');display:block;width:66px;height:57px;}
</style>
<script type="text/javascript">
function tester_retour() {
var ouvrir_page = window.open('http://192.168.1.4/30000/99','','');

/* si le mot "ASCII" est présent dans la page             */
/* ou ne serait-ce qu'une page existe                     */
/* alors changer <div id="img_OFF"> en <div id="img_ON">  */

ouvrir_page.close();
setInterval(tester_retour, 30000);
}
</script>
</head>
<body onload="tester_retour();">
<div id="img_OFF"></div>
</body>
</html>


Configuration: Win 7 / IE 8

5 réponses

Salut,
euh vous parlez de Ping ... pas vraiment de rapport avec JavaScript normal que vous ne trouviez rien!
  • Le ping c'est le temps de réponse entre 2 ordinateurs d'un réseau.
  • JavaScript ne fonctionne qu'en local...( sauf si ce n'est pas le cas mais c'est autre chose du coup) donc il n'y a aucun ping possible!


Quant à setInterval c'est une fonction qui permet de définir une "boucle temporelle"(un intervalle de temps d'éxécution pour la fonction indiquée) pour effectuer une tâche. C'est une fonction qui est(était en fait) souvent utilisé pour faire une animation( chaque étape/séquence ou frame de l'animation étant une répétition de la boucle).
Vous pouvez rajouter un clearInterval pour terminer la boucle et éventuellement la relancer.

Maintenant il est plus commode et pratique - et performant- de faire cela avec la fonction requestAnimationFrame.

Que voulez vous faire exactement et quel est le problème?

C'est normal que ça rame si vous laissez tourner en boucle un script sur la page je pense!
"et la boucle devient tellement rapide que cela bloque IE..."
La boucle indique une durée donc elle ne change pas de vitesse c'est la mémoire(RAM) qui est saturée et donc le navigateur ne peut plus suivre...surtout si vous utilisez IE qui est un navigateur obsolète et réputé pour sa mauvaise gestion de un peu tout, son remplaçant est Edge qui va bientôt changer de moteur pour le même que Chrome de Google.
Avec un navigateur pas à jour ne vous étonnez pas d'avoir des problèmes, les technologies évoluant rapidement(ainsi que les performances) c'est à éviter absolument.


Parce que vous parlez de tester l'existence d'une page. Est ce nécessaire de le faire en boucle et pourquoi? Surtotsur un body.onload ça semble contradictoire...

Aussi utilisez une fonction qui n'ouvre pas la page directement par le navigateur afin d'alléger la charge de travail de celui ci...
Je vous conseille d'utiliser n navigateur à jour (gratuit et plus performant aussi comme FF ou Chrome par exemple) et de remplacer le setInterval par un requestanimationFrame (+ un polyfil pour les navigateurs plus anciens:
Voici un qui est bien connu:
https://gist.github.com/paulirish/1579671
)
qui est plus adapté à ce genre de répétitions mais ça n'empêchera pas de saturer la mémoire si les capacités de l'ordinateur client son dépassées, bref tout dépends de ce que vous faites dans la boucle donc. Peut être aussi mettez le script ailleurs que lors du chargement de la page ce qui permettra de charger celle ci avant tout et après de commencer le script.

JavaScript ne semble pas vraiment adapté non plus puisque vous pouvez éviter d'avoir à charger la page(donc utiliser HTTP et faire charger/ouvrir une page au navigateur) puisque tout peut se passer côté serveur où un langage comme PHP peut faire ça directement( https://www.php.net/manual/fr/function.fopen.php )

Vous avez aussi les tâches CRON sinon qui peuvent faire ça côté serveur : https://fr.wikipedia.org/wiki/Cron

Mais toujours rien à voir avec le délai d'échanges entre 2 ordinateurs du réseau(PING).
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020

Le but est de tester la présence d'un module de contrôle Ethernet qui met un certain temps à être opérationnel à sa mise sous tention. La boucle pourrait s'arrêter quand c'est le cas.

Ma recherche avec "Ping" n'était qu'une façon de trouver un équivalant en JavaScript...

Ce module asservit un rack 1U qui commande des lecteurs audio (en RS-232) via des batteries de relais.

Ma page html me permet de lancer facilement des commandes groupées sur plusieurs machines simultanément. Mais avant cela je dois vérifier que le module et présent et fonctionnel via sa page d'état qui génère un code ASCII avec l'URL http://192.168.1.4/30000/99

Je sais que j'abuse de window.open (pour mes commandes aussi) alors qu'il y a probablement une méthode plus propre et "silencieuse"... C'est ce que j'ai trouvé de plus simple à mettre en œuvre pour moi au vu de mes compétences en programmation.
Et pour simplifier mon message j'ai intégré les feuilles de style et JavaScript dans ma page, en réalité c'est trois fichiers distincts.

Quant au couple Win7/IE8, ce n'est pas un choix, c'est une machine professionnelle de studio pour la numérisation ou le transfert de documents audio.

La conception de ce système de commande devait me simplifier le travail, j'y ai déjà consacré beaucoup de temps, et je ne peux pas le lancer dans une longue programmation dont je n'ai pas les qualifications, ce qui explique mon attrait pour la simplicité ! ;-)

C'est pour cela que j'ai besoin d'aide...
Messages postés
5
Date d'inscription
dimanche 19 janvier 2020
Statut
Membre
Dernière intervention
13 février 2020
1
Bonjour, tout d'abord, je ne suis pas un expert en AJAX, mais je me suis amusé à concocter un petit script qui, je l'espère, conviendra à vos besoins.
Notez que setInterval() est à proscrire justement en raison du comportement que vous signalez. Le problème, c'est que setInterval() ajoute la fonction à la pile d'appel, mais le navigateur étant peut-être occupé à autre chose, il ne l'exécute pas immédiatement. setInterval() continue malgré tout à envoyer les appels à intervalle régulier, ce qui entraîne un fort dérèglement. La solution consiste à utiliser plusieurs setTimeout() :
var tester_retour = function()  {
	var xhr = new XMLHttpRequest(),
	    url = 'http://192.168.1.4/30000/99',
	    timeout = 5000;

	xhr.open('GET', url);
	
	xhr.onload = function() { // succès, réponse 200
		document.getElementById('img_OFF').id = 'img_ON';
	};

	xhr.onerror = function() {
		setTimeout(tester_retour, timeout); // sur erreur, on envoie une nouvelle tentative après x millisecondes
		console.log('échec, prochaine tentative dans ' + timeout /1000 + ' secondes !');
	};

	xhr.send(null);
	console.log('tentative de connexion à ' + url);
};

tester_retour(); // on lance le tout, plus besoin de body onload


Le problème cependant, c'est que l'AJAX n'autorise pas nativement les requêtes cross-domain, c-à-d que le domaine qui envoie la requête doit obligatoirement être 192.168.1.4, sans quoi vous devrez spécifier l'en-tête Access-Control-Allow-Origin sur le script qui génère le code ASCII pour accepter le domaine qui envoie, ou tous les domaines avec *. Sous PHP, ça ressemble à :
header ('Access-Control-Allow-Origin: *'); // doit figurer au tout début car les en-têtes sont envoyées avant le corps.


Voilà, j'espère que vous arriverez à vous débrouiller pour que tout rentre en ordre.
Bonne chance,
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020

Bonjour,

Merci d'avoir pris le temps d'élaborer ce programme.

Je vais injecter ça dans mes pages et faire des tests.

Bon WE

Lo.
Messages postés
109
Date d'inscription
mardi 27 septembre 2011
Statut
Membre
Dernière intervention
6 février 2020

Bonjour de1irium,

Merci beaucoup pour ce coup de main décisif !
Tout fonctionne parfaitement.

Effectivement, j'ai eu un problème de requêtes cross-domain.
Et comme je n'ai pas la main pour ajouter un header,
je lance mon navigateur en "desable web security".

Pour ceux qui souhaiteraient utiliser ces petites cartes Ethernet chinoises
je ferais un petit bilan quand j’aurais un peu plus de temps...

Et encore merci.

Bonne soirée
Lo.