无法读取null的属性'beginPath'

问题描述 投票:0回答:1

我有一个问题,我有一个画布,它的工作原理,但是当我开始绘图时,它返回一个错误,我不知道如何解决它。这是我的画布代码:

// Objet signature  ==>  Le canvas

var Signature = {
    // Attributs
    ecriture : false, // Attribut d'activation de l'écriture
    canvas : document.getElementById("signature"), // Sélection du canvas dans le HTML
    context : null, // Définira le contexte d'utilisation du canvas
    signatureImg : null,
    positionX : null,
    positionY: null,


     // Méthode qui permet de dessiner dans le canvas
    dessin : function(positionX, positionY) {
        this.context = this.canvas.getContext("2d"); // Contexte du canvas
        this.context.lineWidth = 5; // Largeur du tracer
 
        if(this.ecriture){
            this.context.lineTo(positionX, positionY); // Désigne le point d'arrivé du tracer
            this.context.stroke(); // Effectue le tracer
        }
    },
    
    activationDessin : function() {
        this.ecriture = true; // Active l'écriture sur le canvas
        this.context.beginPath(); // Commence un nouveau chemin de dessin
        this.context.moveTo(positionX, positionY); // Désigne le début du tracer
    },
 
    // Méthode qui récupére les coordonnées de l'Élément de pointage (souris, doigt...)
    getMousePos : function(event) {
        rect = this.canvas.getBoundingClientRect(); // Renvoie la taille d'un élément et sa position relative par rapport à la zone d'affichage
 
        return{
            x:event.clientX - rect.left,
            y:event.clientY - rect.top
        };
    },
 
    // Méthode qui détermine le déplacement de l'élément de pointage
    deplacementSouris : function(event) {
        sourisPosition = this.getMousePos(event); // Coordonnées de l'élément de pointage retourner par la méthode "getMousePos"
        positionX = sourisPosition.x;
        positionY = sourisPosition.y;
        this.dessin(positionX, positionY);
    },
 
    
 
    // Méthode qui permet de désactiver l'écriture
    desactivationDessin : function() {
        this.ecriture = false; // Désactive l'écriture dans le canvas
    },
 
    
    
     convertTouchEvent : function(ev) {
        var touch, ev_type, mouse_ev;
        touch = ev.targetTouches[0];
        ev.preventDefault();
        switch (ev.type) {
            case 'touchstart':
                // S'assure qu'un doigt est sur la cible
                if (ev.targetTouches.length != 1) {
                    return;
                }
                touch = ev.targetTouches[0];
                ev_type = 'mousedown';
                break;
            case 'touchmove':
                // S'assure qu'un doigt est sur la cible
                if (ev.targetTouches.length != 1) {
                    return;
                }
                touch = ev.targetTouches[0];
                ev_type = 'mousemove';
                break;
            case 'touchend':
                // Sassure que le doigt a été enlever de la cible
                if (ev.changedTouches.length != 1) {
                    return;
                }
                touch = ev.changedTouches[0];
                ev_type = 'mouseup';
                break;
            default:
                return;
        }
 
        mouse_ev = document.createEvent("MouseEvents");
        mouse_ev.initMouseEvent(
            ev_type, // Genre de l'événement
            true,
            true,
            window, // Vue de l'événement
            0, // Compte de clic de souris
            touch.screenX, // Coordonnée X de l'écran
            touch.screenY, // Coordonnée Y de l'écran
            touch.clientX, // Coordonnée X du client
            touch.clientY, // Coordonnée Y du client
            ev.ctrlKey, // Vérifie si la touche contrôle a été appuyée
            ev.altKey, // Vérifie si la touche alt a été appuyée
            ev.shiftKey, // Vérifie si la touche majuscule a été appuyée
            ev.metaKey, // Vérifie si la touche meta a été appuyée
            0, // Bouton de la souris
            null // Cible
        );

        this.dispatchEvent(mouse_ev);
    },
 
    // Méthode qui permet d'effacer le canvas
    clearCanvas : function() {
        this.context.clearRect(0, 0, 800, 200); // Réinitialise le canvas
    }
    
}

  // Appel des méthodes sur PC
  Signature.canvas.addEventListener("mousedown", Signature.activationDessin.bind(Signature));
  Signature.canvas.addEventListener("mousemove", Signature.deplacementSouris.bind(Signature));
  Signature.canvas.addEventListener("mouseup", Signature.desactivationDessin.bind(Signature));

// Appel des méthodes sur écrans tactiles
  Signature.canvas.addEventListener("touchstart", Signature.convertTouchEvent);
  Signature.canvas.addEventListener("touchmove", Signature.convertTouchEvent);
  Signature.canvas.addEventListener("touchend", Signature.convertTouchEvent);

  // Appel de la méthode d'effacement du canvas lors de l'appui sur le bouton "effacer"
  document.getElementById("boutonEffacer").addEventListener("click", function() {
      Signature.clearCanvas();
  });

当我开始画我的终端时,给我这个错误:

 canvas.js:26 Uncaught TypeError: Cannot read property 'beginPath' of null
    at Object.activationDessin (canvas.js:26)
    at HTMLCanvasElement.convertTouchEvent (canvas.js:109)

实际上这个画布工作,但我不知道如何解决这个错误。我希望有人能帮助我解决它。先感谢您 !

javascript html5-canvas uncaught-typeerror
1个回答
0
投票

你的逻辑错了。你需要在dessin()不再为null之前调用this.context

显示dessin()被称为的唯一地方是deplacementSouris()

deplacementSouris()mousemove事件有关。

因此,在将鼠标移动到画布中之前,您的用户无法单击任何内容,以便上下文不再为null。

找到更新的逻辑来更新this.context。如果不删除或重新呈现HTML中的canvas元素,则可以在定义this.context时立即设置this.canvas

© www.soinside.com 2019 - 2024. All rights reserved.