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 :

Canvas signature (Js pur - POO)


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut Canvas signature (Js pur - POO)
    Bonjour à tous et à toutes !

    J'essaie de créer un Canvas en JS pur et en POO.
    Seulement... il ne fonctionne pas haha, j'ai dû me planter quelque part..

    Si quelqu'un a le temps de jeter un oeil je veux bien

    Voilà le code du canvas :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    class CanvasObjet {
      constructor(){ //Paramètres du canvas
        this.canvas = document.getElementById("canvas");
        this.ctx = this.canvas.getContext('2d');
        this.ctx.strokeStyle = '#000000';
        this.ctx.lineWidth = 3;
        this.draw = false;
        this.mousePosition = { x:0, y:0 };
        this.lastPosition = this.mousePosition;
        this.clearButton = document.getElementById("bt-clear");
        this.canvas.width = 200;
        this.canvas.height = 150;
      }
     
    //Gestion des événements 
    evenements(){
        //Souris
      this.canvas.addEventListener("mousedown", function(e) {
        this.draw = true;
        this.lastPosition = this.getMposition(e);
      }); 
     
      this.canvas.addEventListener("mousemove", function(e) {
        this.mousePosition = this.getMposition(e);
        this.canvasResult()
      });
     
      this.canvas.addEventListener("mouseup", function(e) {
        this.draw = false;
      });
     
     
      // Stop scrolling (touch)
      document.body.addEventListener("touchstart", function(e){
        if (e.target == this.canvas){
          e.preventDefault();
        }
      });
     
      document.body.addEventListener("touchend", function(e){
        if (e.target == this.canvas){
          e.preventDefault();
        }
      });
     
      document.body.addEventListener("touchmove", function(e){
        if (e.target == this.canvas){
          e.preventDefault();
        }
      });
     
     
        // Touchpad
      this.canvas.addEventListener("touchstart", function(e) {
        mousePosition = this.getTposition(e);
        var touch = e.touches[0];
        var mouseEvent = new MouseEvent("mousedown", {
          clientX: touch.clientX,
          clientY: touch.clientY
        });
        this.canvas.dispatchEvent(mouseEvent);
      });
     
      this.canvas.addEventListener("touchmove", function(e) {
        var touch = e.touches[0];
        var mouseEvent = new MouseEvent("mousemove", {
          clientX: touch.clientX,
          clientY: touch.clientY
        });
        this.canvas.dispatchEvent(mouseEvent);
      });
     
      this.canvas.addEventListener("touchend", function(e) {
        var mouseEvent = new MouseEvent("mouseup", {});
        this.canvas.dispatchEvent(mouseEvent);
      });
     
     
      //Effacer
      this.clearButton.addEventListener("click", function(e) {
        this.clearCanvas()
      });
    }
     
    // Renvoie les coordonnées de la souris 
    getMposition(mouseEvent){
      if (this.draw) {
        var oRect = this.canvas.getBoundingClientRect();
        return {
          x: mouseEvent.clientX - oRect.left,
          y: mouseEvent.clientY - oRect.top
        };
      }
    }
     
    // Renvoie les coordonnées du pad 
    getTposition(touchEvent){
      var oRect = this.canvas.getBoundingClientRect();
      return {
        x: touchEvent.touches[0].clientX - oRect.left,
        y: touchEvent.touches[0].clientY - oRect.top
      };
    }
     
    // Dessin du canvas
    canvasResult() {
      if(this.draw){
        this.ctx.beginPath(); 
        this.ctx.moveTo(this.lastPosition.x, this.lastPosition.y);
        this.ctx.lineTo(this.mousePosition.x, this.mousePosition.y);
        this.ctx.stroke();
        this.lastPosition = this.mousePosition;
      }
    };
     
    // Vide le dessin du canvas
    clearCanvas(){
      this.canvas.width = this.canvas.width;
        this.ctx.lineWidth = 3;
    }
     
    }
    Voilà le HTML :
    Code HTML : 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
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Canvas</title>
       <link rel="stylesheet" href="style.css" />
        <script type="text/javascript" src="jsv.js"></script>
    </head>
     
      <body>
     
    <h1>Canvas</h1>
    <div class="mise-en-page">
      <div class="bloc-mise-en-page">
        <h2>Signer (<span id="bt-clear">nettoyer</span>)</h2>
        <canvas id="canvas"></canvas>
      </div>
    </div> 
     
    </body>

    Et le CSS :
    Code CSS : 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
    #canvas{
      width:250px;
      height:150px;
      border:1px solid #000
    }
    #capture{ 
      border:1px solid black;
      width:200px;
      height:150px;
    }
     
    /* MISE EN PAGE*/
    .mise-en-page{}
    .bloc-mise-en-page{margin:10px;
      flex:1 0 0px;   
      min-width:500px;
    }
     
    body{
      font-family: Arial;
    }

    Merci beaucoup

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    On n'a pas le fichier jsv.js...

    Sinon un des problèmes c'est le fameux this*, celui-ci ne pointe pas comme vous l'attendez vers une instance de la class CanvasObjet mais vers l'élément html canvas...

    *Je parle du this utilisé à l'intérieur des fonctions addEventListener...

    EDIT :

    pour résoudre le problème dont je parle j'ai modifié la fonction evenements comme 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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    evenements() {
            var self = this ;
            //Souris
            this.canvas.addEventListener("mousedown", function (e) {
                self.draw = true;
                self.lastPosition = self.getMposition(e);
            });
     
            this.canvas.addEventListener("mousemove", function (e) {
                self.mousePosition = self.getMposition(e);
                self.canvasResult()
            });
     
            this.canvas.addEventListener("mouseup", function (e) {
                self.draw = false;
            });
     
     
            // Stop scrolling (touch)
            document.body.addEventListener("touchstart", function (e) {
                if (e.target == self.canvas) {
                    e.preventDefault();
                }
            });
     
            document.body.addEventListener("touchend", function (e) {
                if (e.target == self.canvas) {
                    e.preventDefault();
                }
            });
     
            document.body.addEventListener("touchmove", function (e) {
                if (e.target == self.canvas) {
                    e.preventDefault();
                }
            });
     
     
            // Touchpad
            this.canvas.addEventListener("touchstart", function (e) {
                mousePosition = self.getTposition(e);
                var touch = e.touches[0];
                var mouseEvent = new MouseEvent("mousedown", {
                    clientX: touch.clientX,
                    clientY: touch.clientY
                });
                self.canvas.dispatchEvent(mouseEvent);
            });
     
            this.canvas.addEventListener("touchmove", function (e) {
                var touch = e.touches[0];
                var mouseEvent = new MouseEvent("mousemove", {
                    clientX: touch.clientX,
                    clientY: touch.clientY
                });
                self.canvas.dispatchEvent(mouseEvent);
            });
     
            this.canvas.addEventListener("touchend", function (e) {
                var mouseEvent = new MouseEvent("mouseup", {});
                self.canvas.dispatchEvent(mouseEvent);
            });
     
     
            //Effacer
            this.clearButton.addEventListener("click", function (e) {
                self.clearCanvas()
            });
        }
    Et cela fonctionne mieux...

  3. #3
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Beginner. a bien vu le problème.
    Plusieurs solutions :
    - utiliser des fonctions fléchées.
    - utiliser bind(this).
    - Ajouter une variable pointant sur this dans evenements (solution de Beginner.).
    - Définir une propriété sur l'élément canvas pointant sur this et dans ce cas, on utilise this.gestionnaire.faireCeci() : le petit défaut est de rajouter dynamiquement des propriétés sur cet objet, des propriétés non prévues de base donc. Si j'en parle c'est que dans d'autres situations, c'est une bonne solution.

    Citation Envoyé par Elztx Voir le message
    Mmmh même avec tes modifications ça ne semble pas fonctionner de mon côté
    Y a-t-il une instance de la classe au moins ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Loralina Voir le message
    Y a-t-il une instance de la classe au moins ?
    Effectivement il fallait ajouter du code pour tester : avoir une instance et aussi lancer l'exécution de la fonction evenements, j'ai rajouté cela pour tester :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var obj = new CanvasObjet();
    obj.evenements();

  5. #5
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Bonjour Loralina Merci pour les explications !

    Oui oui en fin de code. J'ai testé de reprendre le code de Beginner. pour tester, ça ne fonctionne pas non plus c'est vraiment étrange, mon cache est vidé etc pourtant. Il fonctionne bien via le lien fourni.. Je vais tester depuis un autre navigateur/ordi en rentrant !

    Oh, merci ! Je vais regarder ça de plus près tout à l'heure en espérant que ça fonctionne enfin chez moi ^^

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonjour,
    regarde dans la console, F12, les erreurs qui peuvent apparaître.

    Si l’initialisation de ton objet est réalisé dans ton fichier JS, placé en début de ta page, alors le DOM n'est pas encore construit ce qui conduit à une erreur.

  7. #7
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Hello,

    En effet, c'était bien le souci !! Merci beaucoup à tous, ça fonctionne, je vais me pencher sur les décalages

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Je constate cependant qu'il y a d'autres problèmes...
    Il y a un décalage entre la ligne dessinée et le curseur de la souris,
    Et parfois cela continue de dessiner la ligne alors qu'on a relâché la souris...

  9. #9
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Hello, merci pour ton retour !

    Le fichier jsv.js c'est le js du canvas
    Mmmh même avec tes modifications ça ne semble pas fonctionner de mon côté

    Je regarderai du côté des offsets quand j'arriverai à afficher le tracé pour le décalage ^^

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    chez moi le tracé fonctionne, testez ici pour voir : https://jsbin.com/jimiqibago/edit?js,output

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    ...
    Et parfois cela continue de dessiner la ligne alors qu'on a relâché la souris...
    Ce problème a lieu quand on relâche la souris en dehors du canvas, pour le résoudre j'ai remplacé cette fonction :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            this.canvas.addEventListener("mouseup", function (e) {
                self.draw = false;
            });
    par celle-ci :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            document.addEventListener("mouseup", function (e) {
                self.draw = false;
            });

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

Discussions similaires

  1. Diaporama JS pur (POO)
    Par Elztx dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 08/04/2019, 14h17
  2. [POO] Flux webcam dans un Canvas/Frame
    Par nicolivier dans le forum Tkinter
    Réponses: 11
    Dernier message: 26/05/2013, 09h36
  3. [POO] Destructeur virtuel pur
    Par Nesto dans le forum C++
    Réponses: 3
    Dernier message: 08/11/2008, 17h18
  4. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 11h38
  5. Réponses: 2
    Dernier message: 17/05/2002, 20h37

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