Foros del Web » Programando para Internet » Javascript »

Por qué CANVAS 1 y 2 dibujan en el CANVAS 3

Estas en el tema de Por qué CANVAS 1 y 2 dibujan en el CANVAS 3 en el foro de Javascript en Foros del Web. Hola a todos y gracias como siempre de antemano, por cualquier ayuda sobre el tema. Estoy desarrollando una página en HTML y JAVASCRIPT, donde pueda ...
  #1 (permalink)  
Antiguo 09/07/2021, 10:46
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 8 años, 1 mes
Puntos: 1
Por qué CANVAS 1 y 2 dibujan en el CANVAS 3

Hola a todos y gracias como siempre de antemano, por cualquier ayuda sobre el tema.

Estoy desarrollando una página en HTML y JAVASCRIPT, donde pueda registrar 3 viajeros. A parte de introducir varios datos necesito que los viajeros firmen cada uno en su lugar y para ello he insertado 3 canvas.

Adjunto código:

Código:
<label>Firma del viajero 1</label><br>
<div>
<script type="text/javascript" src="v1sign.js"></script>
<canvas id="v1sign"></canvas>
<br>
<button onclick="javascript:clearArea();return false;">Limpiar</button>
</div><br>
Este código se repite para los viajeros 2 y 3 en diferentes lugares de la página.

El archivo al que llama el script contiene el siguiente código:

Código:
var mousePressedvj1 = false;
var lastXvj1, lastYvj1;
var vj1;

function InitThisvj1() {
    vj1 = document.getElementById('v1sign').getContext("2d");

    $('#v1sign').mousedown(function (e) {
        mousePressedvj1 = true;
        Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);
    });

    $('#v1sign').mousemove(function (e) {
        if (mousePressedvj1) {
            Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);
        }
    });

    $('#v1sign').mouseup(function (e) {
        mousePressedvj1 = false;
    });
	    $('#v1sign').mouseleave(function (e) {
        mousePressedvj1 = false;
    });
}

function Draw(x, y, isDown) {
    if (isDown) {
        vj1.beginPath();
        vj1.strokeStyle = "blue";
        vj1.lineWidth = "3";
        vj1.lineJoin = "round";
        vj1.moveTo(lastXvj1, lastYvj1);
        vj1.lineTo(x, y);
        vj1.closePath();
        vj1.stroke();
    }
    lastXvj1 = x; lastYvj1 = y;
}
	
function clearArea() {
    vj1.setTransform(1, 0, 0, 1, 0, 0);
    vj1.clearRect(0, 0, vj1.canvas.width, vj1.canvas.height);
}
Lo que me ocurre es lo siguiente: Al insertar el último código, el del CANVAS 3, el único que funciona es el mismo CANVAS 3, es decir, si yo dibujo en el canvas 1, lo que he pintado se muestra en el canvas 3... si dibujo en el canvas 2 se muestra tambien en el canvas 3... El canvas 1 y 2 no muestran las lineas que dibujo con el ratón... y cada uno debería de ser independiente.

Cada canvas tiene su archivo: v1sign para el canvas 1, v2sign para el canvas 2 y v3sign para el canvas 3, pero el unico que funciona es el 3, de hecho si quito el 3, empieza a funcionar el 2... Los archivos los modifico cada uno con v1sign, v2sign o v3sign segun el caso en
Código:
document.getElementById('v1sign').getContext("2d");
y tambien cambio el nombre de las variables por vj1, vj2 y vj3.

Para llamar las funciones uso esto:

Código:
<script language="javascript">
function startsign(){
    InitThisvj1();
    InitThisvj2();
    InitThisvj3();
}
</script>
</head>
<body onload="startsign()">
He probado unas cuantas cosas y o bien sigo igual o bien deja de funcionar todo directamente y javascript no es mi fuerte... Alguien que haya trabajado con varios canvas puede echarme una mano?

Mil gracias de antemano.
Un abrazo!!
  #2 (permalink)  
Antiguo 09/07/2021, 15:13
 
Fecha de Ingreso: abril-2011
Mensajes: 169
Antigüedad: 10 años, 7 meses
Puntos: 68
Respuesta: Por qué CANVAS 1 y 2 dibujan en el CANVAS 3

En ese caso, también tienes que cambiar $('#v1sign') por $('#v2sign'), $('#v3sign') etc, para cada uno de los 3 scripts.

Aunque, en lugar de cargar 3 scripts distintos para cada canvas, es mucho mejor tener un único script que defina una función y pasarle un parámetro con el ID del canvas que quieres inicializar. El código sería algo así:

Código Javascript:
Ver original
  1. function iniciarCanvas(id_canvas){
  2.     var mousePressedvj = false;
  3.     var lastXvj, lastYvj;
  4.     var vj;
  5.  
  6.     function InitThisvj() {
  7.         vj = document.getElementById(id_canvas).getContext("2d");
  8.  
  9.         var canvas = $('#' + id_canvas);
  10.  
  11.         canvas.mousedown(function (e) {
  12.             mousePressedvj = true;
  13.             Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);
  14.         });
  15.  
  16.         canvas.mousemove(function (e) {
  17.             if (mousePressedvj) {
  18.                 Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);
  19.             }
  20.         });
  21.  
  22.         canvas.mouseup(function (e) {
  23.             mousePressedvj = false;
  24.         });
  25.         canvas.mouseleave(function (e) {
  26.             mousePressedvj = false;
  27.         });
  28.     }
  29.  
  30.     function Draw(x, y, isDown) {
  31.         if (isDown) {
  32.             vj.beginPath();
  33.             vj.strokeStyle = "blue";
  34.             vj.lineWidth = "3";
  35.             vj.lineJoin = "round";
  36.             vj.moveTo(lastXvj, lastYvj);
  37.             vj.lineTo(x, y);
  38.             vj.closePath();
  39.             vj.stroke();
  40.         }
  41.         lastXvj = x; lastYvj = y;
  42.     }
  43.        
  44.     function clearArea() {
  45.         vj.setTransform(1, 0, 0, 1, 0, 0);
  46.         vj.clearRect(0, 0, vj.canvas.width, vj.canvas.height);
  47.     }
  48.  
  49.     InitThisvj();
  50. }

Y lo deberías inicializar así:

Código HTML:
Ver original
  1. <script language="javascript">
  2. function startsign(){
  3.     iniciarCanvas("v1sign");
  4.     iniciarCanvas("v2sign");
  5.     iniciarCanvas("v3sign");
  6. }
  7. </head>
  8. <body onload="startsign()">

Así solo tendrías que cargar el script una vez.



Última edición por prueba230683; 09/07/2021 a las 15:40
  #3 (permalink)  
Antiguo 09/07/2021, 23:30
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: Por qué CANVAS 1 y 2 dibujan en el CANVAS 3

Hola prueba230683.

Si, había probado algo parecido y no me había funcionado por eso lo estaba intentando con archivos separados... Pero este código que me envías funciona a la perfección, muchísimas gracias.

Lo único que ahora no me funciona el botón de limpiar para cada uno de los canvas, por si los viajeros se equivocan al hacer la firma.

Supongo que la función vale la misma no? Sólo habría que indicarle el canvas que tiene borrar... imagino que con algo así?

Código:
var cv = $('#' + id_canvas);
function clearArea() {
        cv.setTransform(1, 0, 0, 1, 0, 0);
        cv.clearRect(0, 0, cv.canvas.width, cv.canvas.height);
    }
Gracias de nuevo.
Un abrazo!!
  #4 (permalink)  
Antiguo 10/07/2021, 12:04
 
Fecha de Ingreso: abril-2011
Mensajes: 169
Antigüedad: 10 años, 7 meses
Puntos: 68
Respuesta: Por qué CANVAS 1 y 2 dibujan en el CANVAS 3

Cita:
Lo único que ahora no me funciona el botón de limpiar para cada uno de los canvas, por si los viajeros se equivocan al hacer la firma.
Cierto. Como bien dices, tendrías que añadir al script una función así:

Código Javascript:
Ver original
  1. function limpiarCanvas(id_canvas) {
  2.     var vj = document.getElementById(id_canvas).getContext("2d");
  3.     vj.setTransform(1, 0, 0, 1, 0, 0);
  4.     vj.clearRect(0, 0, vj.canvas.width, vj.canvas.height);
  5. }

y llamarla así para cada uno de los botones:

Código HTML:
Ver original
  1. <button onclick="limpiarCanvas("v1sign");return false;">Limpiar</button>
  2.  
  3. <button onclick="limpiarCanvas("v2sign");return false;">Limpiar</button>
  4.  
  5. <button onclick="limpiarCanvas("v3sign");return false;">Limpiar</button>

En definitiva, el script completo sería este:

Código Javascript:
Ver original
  1. function iniciarCanvas(id_canvas){
  2.     var mousePressedvj = false;
  3.     var lastXvj, lastYvj;
  4.     var vj;
  5.  
  6.     function InitThisvj() {
  7.         vj = document.getElementById(id_canvas).getContext("2d");
  8.  
  9.         var canvas = $('#' + id_canvas);
  10.  
  11.         canvas.mousedown(function (e) {
  12.             mousePressedvj = true;
  13.             Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);
  14.         });
  15.  
  16.         canvas.mousemove(function (e) {
  17.             if (mousePressedvj) {
  18.                 Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);
  19.             }
  20.         });
  21.  
  22.         canvas.mouseup(function (e) {
  23.             mousePressedvj = false;
  24.         });
  25.         canvas.mouseleave(function (e) {
  26.             mousePressedvj = false;
  27.         });
  28.     }
  29.  
  30.     function Draw(x, y, isDown) {
  31.         if (isDown) {
  32.             vj.beginPath();
  33.             vj.strokeStyle = "blue";
  34.             vj.lineWidth = "3";
  35.             vj.lineJoin = "round";
  36.             vj.moveTo(lastXvj, lastYvj);
  37.             vj.lineTo(x, y);
  38.             vj.closePath();
  39.             vj.stroke();
  40.         }
  41.         lastXvj = x; lastYvj = y;
  42.     }
  43.  
  44.     InitThisvj();
  45. }
  46.        
  47. function limpiarCanvas(id_canvas) {
  48.     var vj = document.getElementById(id_canvas).getContext("2d");
  49.     vj.setTransform(1, 0, 0, 1, 0, 0);
  50.     vj.clearRect(0, 0, vj.canvas.width, vj.canvas.height);
  51. }

  #5 (permalink)  
Antiguo 11/07/2021, 00:38
 
Fecha de Ingreso: octubre-2013
Ubicación: Madrid
Mensajes: 53
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: Por qué CANVAS 1 y 2 dibujan en el CANVAS 3

Hola prueba230683.

Gracias de nuevo por tu respuesta. Así lo he hecho, ya he colocado todo el código, en un solo archivo y todo funciona bien, salvo la funcion de borrar que no produce ningun resultado... lo he revisado varias veces y debería funcionar, yo lo veo todo OK pero... tienes alguna idea porque no borra ningun canvas?

Gracias.
Un Saludo.!
  #6 (permalink)  
Antiguo 11/07/2021, 11:57
 
Fecha de Ingreso: abril-2011
Mensajes: 169
Antigüedad: 10 años, 7 meses
Puntos: 68
Respuesta: Por qué CANVAS 1 y 2 dibujan en el CANVAS 3

Oops, puse dobles comillas. Tienen que ser comillas simples para no romper la sintaxis html:

Código HTML:
Ver original
  1. <button onclick="limpiarCanvas('v1sign');return false;">Limpiar</button>
  2.  
  3. <button onclick="limpiarCanvas('v2sign');return false;">Limpiar</button>
  4.  
  5. <button onclick="limpiarCanvas('v3sign');return false;">Limpiar</button>

DEMO


Última edición por prueba230683; 11/07/2021 a las 18:24



La zona horaria es GMT -6. Ahora son las 23:50.