无法读取null的属性“ beginPath”

时间:2019-03-19 12:44:05

标签: javascript html5-canvas uncaught-typeerror

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

// 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)

此画布工作正常,但我不知道如何解决此错误。 我希望有人可以帮助我修复它。 先感谢您 !

1 个答案:

答案 0 :(得分:0)

您的逻辑是错误的。您需要先调用.DatOfYear,然后dessin()不再为空。

显示的唯一调用this.context的地方是在dessin()内部。

deplacementSouris()绑定到deplacementSouris()事件。

因此,用户在将鼠标移到画布内之前无法单击任何内容,因此上下文将不再为空。

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