IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

portée de Variable


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 117
    Points : 67
    Points
    67
    Par défaut portée de Variable
    Bonsoir !

    Je cherche désespérément à faire ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <script>
    function Server_Disabled(kstatus)
    {
    	kstatus.status = 0;
        alert(kstatus.status);
    }
     
    var kstatus = { status:  1};
    document.write('<img src="http://.../public/spacer.gif" border="0" height="0" width="0"  onError="Server_Disabled(kstatus);" />');
     alert(kstatus.status);
    </script>
    Donc j'essaie simplement de mettre le status de la variable globale kstatus à 0 lorsqu'une erreur est survenue pendant le chargement de l'image .

    Mais ça marche pas .. je ne comprends pas pourquoi !
    Pourtant quand j'apelle la fonction toute seule (en dehors du document.write) le champ status est bien changé ! Mais là non ..

    Pourquoi ça marche pas ?
    Est ce que je m'y prends mal peut être?

    Merci d'avance
    Bien cordialement.

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    bonjour,

    déjà utiliser document.write() est une erreur à elle seule

    Dans ton code document.write() remplace tout le code HTML par le paramètre de write. Donc au moment où tu appelles cette méthode la fonction
    Server_Disabled n'existe plus !

    Ensuite ce n'est pas parce que javascript est permissif qu'il faut faire n'importe quoi :
    pourquoi déclarer ton objet kstatus après la création de ta fonction ?


    Voici donc quelque chose de propre :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    var kstatus = new Object();
    function Server_Disabled(kstatus)
    {
    	kstatus.status = 0;
        alert(kstatus.status);
    }
     
    function loadImg()
    {
    	var myImg;
     
    	kstatus.status = 1;
     
    	myImg = document.createElement("img");
    	myImg.src="images/monImage.jpg";	
    	myImg.onerror = function(){Server_Disabled(kstatus)};
    	document.body.appendChild(myImg);
    }

    puis ton code HTML :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <body onload="loadImg()">
    appelle loadImg() lors de l'événment onload.

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    En complément, tu commets aussi une erreur sur les variables.
    Dans ton code, tu déclares une variable globale kstatus.
    Mais ensuite, en appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Server_Disabled(kstatus)
    tu crées une nouvelle variable kstatus, locale à la fonction et qui n'a rien à voir avec la globale
    Donc appelle ta fonction comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Server_Disabled()
    et tu auras accès dans ta fonction à la variable globale kstatus.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    Citation Envoyé par Bovino Voir le message
    En complément, tu commets aussi une erreur sur les variables.
    Dans ton code, tu déclares une variable globale kstatus.
    Mais ensuite, en appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Server_Disabled(kstatus)
    tu crées une nouvelle variable kstatus, locale à la fonction et qui n'a rien à voir avec la globale
    ouh là je n'ai pas vu l'erreur

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 117
    Points : 67
    Points
    67
    Par défaut
    Bonsoir et Merci infiniment pour vos réponses super rapide !

    Je suis désolé la syntaxe du javascript me fait défaut. J'étais à mille lieux d'imaginer le conflit avec la variable globale !

    Pour revenir au souci, j'ai oublié de préciser que je n'ai pas le droit de modifier la page dans laquelle je travaille, ainsi je ne suis pas autorisé à toucher la balise body

    Dans tous les cas j'ai effectué plusieurs test avec ce que vous m'avez fourni (un grand merci !) mais la fonction associé au onError n'est exécuté qu'après un léger délai, (Volontairement je STOP apache sur le serveur ou est hebergé l'image ainsi on a presque immédiatement un "unable to connect" : temps de résolution de l'erreur inférieur à une demi seconde)

    En effet si j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <img src="http://idclip" border="0" height="0" width="0"  id="test_server"/>// <!-- Test 1 : modification à la volée de l'attribut on error ds une balise img -->
    <script type="text/javascript">
    var kstatus = { status:  1};
    function Server_Disabled()
    {
        alert("mise à 0");
    	kstatus.status = 0;
    }
    function Test_Server(url)// <!-- Test 2, à l'aide de l'objet Image -->
    {
    	var img = new Image();
     
    	img.onerror = function() {Server_Disabled()};
    	img.src = url;	
    }
    function loadImg(url)// <!-- Test 3 , en utilisant un appenchild -->
    {
    	var myImg;
     
    	myImg = document.createElement("img");
    	myImg.src=url;	
    	myImg.onerror = function(){Server_Disabled()};
    	document.body.appendChild(myImg);
    }
     
    Test_Server("http://idkfq"); // <!-- Test 2 --> 
    loadImg("http://iddad"); // <!-- Test 3 -->
    var img_test = document.getElementsById("test_server"); // <!-- Test 1 -->
    img_test.setAttribute("onError", "Server_Disabled();"); // <!-- Test 1 -->
    </script>
    <img src="http://idbeholds" border="0" height="0" width="0"  onError="Server_Disabled();" /> <!-- Test 4, en dur dans une image -->
    <script type="text/javascript">
    for (var i = 0; i < 2; i++)
    alert("Fin du test, statut du serveur à :"+kstatus.status);
    </script>
    Je vois écrit à l'écran que le statut est toujours à 1.
    Puis un millième de seconde après j'ai enfin mes 4 messages "mise à 0" ....
    (Bien évidemment les urls que j'utilise pointent toutes vers une même image hebergé sur mon serveur où apache est coupé)
    Je pensais au début que le Onerror n'était exécuté qu'à la fin de la page (ce qui doit être le cas pour appendchild) mais c'est pas possible pour le test n°4 par exemple (L'appel à onError est en dur dans la balise img)

    Peut être que ce que je recherche, i.e : "être capable d'executer un bout de code Si et seulement si ma fonction Onerror n'est pas appelée" n'est pas possible en javascript pur.



    Cordialement.

  6. #6
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    euh.... tu as regroupé ces 4 tests dans un même fichier ?

    Par ailleurs, cette syntaxe me donne des migraines :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    img_test.setAttribute("onError", "Server_Disabled();");
    pourquoi ne pas faire au plus simple comme dans l'exemple que j'ai posté ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myImg.onerror = function(){Server_Disabled()};
    je n'ai toujours pas compris cet engouement pour les méthodes setAttribute() et getAttribute() en javascript. Il faut vraiment qu'on m'explique....



    En te relisant je n'ai pas bien compris ce que tu cherchais à faire... Puis
    Peut être que ce que je recherche, i.e : "être capable d'executer un bout de code Si et seulement si ma fonction Onerror n'est pas appelée" n'est pas possible en javascript pur.
    Je connais javascript mais le javascript "pur" c'est quoi ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 117
    Points : 67
    Points
    67
    Par défaut
    Bonsoir,

    Non je n'ai pas fait ces 4 tests à l'aide d'un seul fichier , mais je les ai formaté dans un seul afin de vous les présenter !
    De plus je ne tenais pas particulièrement à effectuer un setattribute mais je tente d'explorer toutes les voies !
    Enfin, j'ai utilisé votre code mais comme pour les trois autres, sans body onload il n'est lancé qu'après l'exécution de tout le code javascript de la page.


    Pour faire plus simple : je cherche à ne PAS exécuter un bout de code javascript SI une image spécifique n'a pas été chargée ..


    Peut être que ce n'est pas possible après tout


    Dans tout les cas je ne suis pas capable d'exprimer plus clairement mon objectif qu'à travers le code qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <img src="http://testserver/spacer.gif" border="0" height="0" width="0"  onError="Server_Disabled();" /> 
    <script type="text/javascript">
    var flag = {value: 1};
    Server_Disabled()
    {
     flag.value = 0;
    }
    if (flag.value != 0)
    {
     /* Ca tourne */
    }
    </script>
    Ps : du javascript pur, je ne sais plus où j'ai lu cette expression mais ça fait simplement référence à du js sans ajax, activex , langage non javascript et surtout sans appel à des bibliotheque externe (non libre de droit)

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    Si tu ne peux pas toucher à la balise body tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window.onload=function(){loadImg()};
    Maintenant si tu ne veux pas exécuter un code si une image a été chargée, tu peux également placer un événement onload sur ta balise img. Mais (et c'est un gros mais ) cet événement ne fonctionne pas sous IE !!

    Pour IE, on va donc utiliser la propriété readyState sur l'image et ajouter un timer qui va vérifier régulièrement cette propriété. Le timer sera stoppé si une erreur (onerror) a été générée ou si l'image est complètement chargée.

    Donc ton script ressemblerait à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    var kstatus = new Object();
    var myImg;
    var timerIE = null;
     
    function Server_Disabled()	// si erreur de chargement de l'image
    {
    	if (timerIE!=null)
    		clearInterval(timerIE);
     
    	kstatus.status = 0;
        alert(kstatus.status);
    }
     
    function Server_Enabled()	// si pas d'erreur
    {
    	if (timerIE!=null)
    		clearInterval(timerIE);
     
    	kstatus.status = 1;
        alert(kstatus.status);
    }
     
    function ImageStatusIE()
    {
    	if (myImg.readyState.toLowerCase()=="complete")
    	{
    		clearInterval(timerIE);
    		Server_Enabled();
    	}
    }
     
     
    function loadImg()
    {
    	kstatus.status = 1;
     
    	myImg = document.createElement("img");
    	myImg.src="images/i1.gif";	
    	myImg.onerror = function(){Server_Disabled()};
     
    	if (document.all)
    	{
    		// IE : on vérifie toutes les 500ms le statut de chargement de l'image
    		timerIE = setInterval("ImageStatusIE()","500");	
    	}
    	else
    	{
    		// FF et autres navigateurs
    		myImg.onload = function(){Server_Enabled()};	
    	}
     
     
    	document.body.appendChild(myImg);
    }
     
    window.onload=function(){loadImg()};
    [edit]
    Pas sûr que onload sur les images fonctionne avec tous les navigateurs. A vérifier
    [/edit]

  9. #9
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Auteur Voir le message
    [edit]
    Pas sûr que onload sur les images fonctionne avec tous les navigateurs. A vérifier
    [/edit]
    Si à priori, le problème essentiel, c'est que pour les images déjà en cache, il n'y a pas besoin de "load", donc pas de onload.
    Il est donc bon de coupler le test avec les propriétés complete des images

    Voir : Comment savoir que toutes les images ont été chargées ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

Discussions similaires

  1. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 10h21
  2. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  3. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  4. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05
  5. [FLASH MX 2004][XML]portée de variable
    Par marco_ dans le forum Flash
    Réponses: 8
    Dernier message: 29/04/2004, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo