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 :

Le canvas n'est pas trouvé sur ma page HTML [API HTML5]


Sujet :

JavaScript

  1. #1
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut Le canvas n'est pas trouvé sur ma page HTML
    Salut

    J'ai un petit problème simple mais bizarre je ne trouve pas la solution : Le canvas semble ne pas être vu par "document.get...." oO

    La console m'affiche l'erreur : ctx indéfini quand je lance la fonction de dessin d'un carré.
    Il n'y a pas d'erreur affichée lorsque la fonction getctx() est lancée mais seulement quand la fonction de dessin est lancée.

    Mon code JS est une fonction init(), dont le début lance une fonction getctx() pour lire le context d'un canvas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function init(){
    	var ctx=getctx();
    Voilà mon code de la fonction ctx() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function getctx(){
    			alert("ok");
    	if(document.getElementById("canvas")){
    		var canvas=document.getElementById('canvas');
    		canvas.style.width=1200+"px";
    		canvas.style.height=1200+"px";
    		var ctx=canvas.getContext("2d");
    		return ctx;
    	}
    }
    On y voit un alert() qui apparaît bien quand la fonction se lance, mais il n'apparaît pas si je déplace l'alert() juste sous la condition if().
    Ce qui signifie que le canvas n'est pas trouvé dans ma page HTML non ?
    Pourtant le canvas est bien sur ma page HTML avec l'id="canvas".

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <body>
    <canvas id="canvas"></canvas>
    </body>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Dessine un carré bleu, mais cette fonction ne fonctionne pas et j'ai l'erreur ctx indéfini.
    function bleu(x1,y1,x2,y2){
    	var ctx=getctx();
    	ctx.fillStyle="blue";
    	ctx.fillRect(x1,y1,x2,y2);
    }

  2. #2
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Est-ce que mon problème viendrait du fait que je n'ai pas mis de fichier css pour le canvas ?

  3. #3
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Non, ce n'est pas un problème de CSS. À ce sujet, je te déconseille de passer par style pour modifier les dimensions du canevas. Du point de vue du moteur de rendu HTML, l'élément <canvas> a un comportement semblable à celui de <img>. Comme les images, il a des attributs HTML width et height, à ne pas confondre avec les styles du même nom. As-tu déjà essayé de modifier les styles width et height d'une image ? L'image est étirée (ou comprimée), et souvent avec un algorithme d'interpolation assez pauvre. Le résultat est moche. Si tu étires ton canevas, son contenu sera déformé de la même façon.

    Morale de l'histoire : il faut modifier les attributs HTML directement. En plus, la syntaxe est plus simple :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    canvas.width = 1200;
    canvas.height = 1200;

    Concernant ton problème, je pense que c'est simplement ta fonction init() qui est appelée trop tôt, alors que le DOM n'est pas construit. C'est un problème classique. Pour corriger ça, place ta balise <script> juste avant </body>, ou alors utilise document.addEventListener("DOMContentLoaded", …).

    Conseil : pour mieux localiser tes erreurs, tu peux ajouter du code de sécurité, des throw qui indiquent quand quelque chose ne va pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function getctx(){
    	if(document.getElementById("canvas")){} else {
    		throw new Error("canvas introuvable :x");
    	}
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Merci beaucoup Watilin pour tes conseils éclairés !

    Pourtant j'avais mis ce code pour attendre que la page soit chargée :
    C'est bizarre, je vais suivre tes conseils déjà on verra après

  5. #5
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    J'ai regardé cette page :
    http://javascript.info/tutorial/onlo...mcontentloaded

    Ils disent qu'avec Firefox y a problème avec ondomcontentloaded je crois non ?
    Je sais pas si je comprend mal la page ou pas.

    Du coup je suis bloqué si je veux pas mettre de script dans le body.

    Mais c'est bizarre quand même car la méthode d'appel que j'ai utilisé fonctionne dans un autre programme.

    Un window.onload qui appelle une fonction init() qui se charge d'appeler le lecteur de context du canvas. (tout comme j'ai fait).

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    peut être que si tu nous mettais tout ton code on y verrait plus clair dans l'ordre d'appel et à quoi te servent ces multiples var ctx.

  7. #7
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Ce que j'ai mis est ce qui a trait à l'erreur le reste n'a rien à voir, c'est de la création d'objets.

    Voilà mon code complet mais je vois pas ce que ça change par rapport à ce que j'ai déjà mis :/
    L'erreur ctx indéfini est en ligne "ctx.fillStyle..."

    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
     
    function getctx(){
    	if (document.getElementById('canvas')){	
    		var canvas=document.getElementById("canvas");
    		canvas.style.width=1200+"px";
    		canvas.style.height=1200+"px";
    		var ctx=canvas.getContext("2d");
    		return ctx;
    	}	
    }
     
    // Dessine un carré beu
    function bleu(x1,y1,x2,y2){
    	var ctx=getctx();
    	ctx.fillStyle='blue';
    	ctx.fillRect(0,0,40,40);
    }
     
    function init(){
    	var plateau=[];
    	var pion=new Image();
    	pion.src="";
    	for(i=0;i<8;i++){
    		plateau[i]=[];
    		for(j=0;j<8;j++){
    			var x1=j*150;
    			var x2=x1+150;
    			var y1=i*150;
    			var y2=y1+150;
    			bleu(20,30,60,60);
    			if(i==0){
    				tank.couleur=1;
    				if(Math.round(j/2)*2!=j){
    					plateau[i][j]=tank;
    					pion.src="noir.png";
    				}	
    			}else
    			if(i==7){
    				tank.couleur=2;
    				if(Math.round(j/2)*2==j){
    					plateau[i][j]=tank;
    					pion.src="blanc.png";
    				}
    			}else
    			{
    				plateau[i][j]=car;
    			}
    			var ctx=getctx();
    			ctx.drawImage(pion,x1,y1);
    		}
    	}
    }
     
    // Début du programme
    window.onload=init();

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (document.getElementById('canvas')){	
        var canvas=document.getElementById("canvas");
    tu ne rentres pas dans le if

    tu devrais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var canvas=document.getElementById("canvas");
        if( canvas){
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( canvas=document.getElementById("canvas")){

  9. #9
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Merci NoSmoking je vais essayer ta 2 eme version !
    C'est bizarre pourtant ma méthode fonctionne dans un autre programme j'ai juste copié/collé cette partie-là, celle du getContext().

    EDIT : Même erreur quand je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Fonction de lecture du contexte du canvas, renvoie le contexte.
    function getctx(){
    	if( canvas=document.getElementById("canvas")){
    		//var canvas=document.getElementById("canvas");
    		canvas.style.width=1200+"px";
    		canvas.style.height=1200+"px";
    		var ctx=canvas.getContext("2d");
    		return ctx;
    	}	
    }
    J'ai essayé aussi en enlevant les traits de commentaire.

    Cette ligne me dit canvas non défini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(canvas==document.getElementById("canvas")){

  10. #10
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Avec ta première version de canvas, j'ai la même erreur qu'à mon début.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Fonction de lecture du contexte du canvas, renvoie le contexte.
    function getctx(){
    	var canvas=document.getElementById("canvas");
        if( canvas){
    		//var canvas=document.getElementById("canvas");
    		var ctx=canvas.getContext("2d");
    		return ctx;
    	}	
    }

  11. #11
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Concernant la ligne
    Les parenthèses sont en trop car ces dernières enclenchent l'appel à la fonction. Alors que nous avons besoin de sa référence.


  12. #12
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Ah ? Merci je vais tester !

    ça marche !!!!!!!!!!!!!!!!

    Merci Eric2a c'est super !
    J'ai comparé avec un autre programme d'où j'ai copié le getContext et c'est vrai que lui aussi utilise le init sans les parenthèses c'est pour ça qu'il fonctionne et pas ce programme-ci :/

    Merci encore à vous deux pour votre aide et bonne soirée !

  13. #13
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Ah bien vu Eric2a, j'étais en train de me creuser la tête

    Citation Envoyé par progdebutant Voir le message
    J'ai regardé cette page :
    http://javascript.info/tutorial/onlo...mcontentloaded

    Ils disent qu'avec Firefox y a problème avec ondomcontentloaded je crois non ?
    Je sais pas si je comprend mal la page ou pas.
    Ils disent simplement que Firefox ne remplit pas automatiquement les champs de formulaire avant cet évènement. Ça ne nous concerne pas dans le cas présent.

    Sinon j'aime bien ton test de parité avec Math.round, je le trouve astucieux
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  14. #14
    Membre habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Sinon j'aime bien ton test de parité avec Math.round, je le trouve astucieux
    Aaah pour une fois qu'on dit pas de mal de moi, c'est cool

    Merci, venant de toi ça me fait comme si j'avais touché le loto

  15. #15
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Citation Envoyé par Watilin
    Ah bien vu Eric2a,...
    vu mais pas tilté le moindre du monde

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fichier .jar sur serveur n'est pas trouvé
    Par Chavadam dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 18/06/2014, 13h26
  2. Le css n'est pas dispo mais la page html en contient !
    Par mappy dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 29/07/2006, 11h37
  3. [information] utiliser des "dessins" si le fichier image n'est pas trouvé
    Par TabrisLeFol dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 25/05/2006, 12h05
  4. [ImageMagick] imagettftext, ma police n'est pas trouvée
    Par beho dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 21/12/2005, 16h08
  5. [XSD] le schéma xsd n'est pas trouvé!
    Par cpicass dans le forum Valider
    Réponses: 5
    Dernier message: 09/06/2005, 10h48

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