2012-02-05 27 views
24

Estoy tratando de usar Javascript para agregar un lienzo a una página que originalmente no tiene una. estoy tratando de hacer lo siguiente:Añadir lienzo a una página con javascript

var canv=document.createElement("canvas"); 
canv.setAttribute("id", "canvasID"); 
alert(canv.id); 
var c=document.getElementById("canvasID"); 
alert(c.id); 

El problema es que los resultados de la primera alerta (canv.id) en canvasID, mientras que la segunda alerta no está definido porque c es nulo.

¿Alguien puede decirme qué estoy haciendo mal?

PD: el código está diseñado para ejecutarse en Greasemonkey, por lo que agregar el lienzo y su ID en el HTML no es una opción viable.

+1

No lo hiciste 't agregar 'canv' al DOM. Además, no tiene que obtener el lienzo por su ID ya que ya se hace referencia en 'canv'. –

+0

Estaba tratando de obtener el lienzo por identificación como una especie de "prueba" de que el lienzo se ha agregado correctamente. ¿A qué te refieres con "No agregaste canv al DOM"? ? – nick2k3

+4

el lienzo está simplemente flotando en el espacio. Tiene que adjuntarse al DOM, algo así como 'document.body.appendChild (canv);', hará el truco. –

Respuesta

42

usar algo como Node.appendChild(child) para agregarlo a la DOM:

var canv = document.createElement('canvas'); 
canv.id = 'someId'; 

document.body.appendChild(canv); // adds the canvas to the body element 
document.getElementById('someBox').appendChild(canv); // adds the canvas to #someBox 

O puede utilizar element.innerHTML:

document.body.innerHTML += '<canvas id="someId"></canvas>'; // the += means we add this to the inner HTML of body 
document.getElementById('someBox').innerHTML = '<canvas id="someId"></canvas>'; // replaces the inner HTML of #someBox to a canvas 
+0

¡Gracias que lo hizo! ¿Hay una forma más elegante de crear un elemento y agregar una ID? algo como document.createElement ('canvas', "canvasID"); ?? – nick2k3

+0

@ nick2k3 no, en JS los atributos deben establecerse mediante. o setAttributes. –

3
var canv=document.createElement("canvas"); 
canv.setAttribute("id", "canvasID"); 
document.body.appendChild(canv); 

Sin algo así como esa tercera línea, su nuevo lienzo nunca se inserta realmente en la página.

4
var canvas = document.getElementById('canvas'); //finds Original Canvas 
    img = document.createElement('img'); 
    img.src = 'images/a.jpg'; //stores image src 

    var canv = document.createElement('canvas'); // creates new canvas element 
    canv.id = 'canvasdummy'; // gives canvas id 
    canv.height = canvas.height; //get original canvas height 
    canv.width = canvas.width; // get original canvas width 
    document.body.appendChild(canv); // adds the canvas to the body element 

    var canvas1 = document.getElementById('canvasdummy'); //find new canvas we created 
    var context = canvas1.getContext('2d'); 

    context.drawImage(img, 0, 0, canvas.width, canvas.height); //draws background image 
    context.drawImage(canvas, 0, 0); //draws original canvas on top of background 
    cscreen = canvas1.toDataURL(); //generates PNG of newly created canvas 
    document.body.removeChild(canv); // removes new canvas 

Yo uso esta todo el tiempo y funciona muy bien ...

+0

Hola, Jeff. Bienvenido a Stack Overflow. ¿Podría editar su respuesta para explicar por qué el póster debería usar su código en lugar del código publicado en la pregunta (o alguna de las respuestas)? Hay un montón de "ruido" en su respuesta que trata de crear y dibujar imágenes en el lienzo, que no tiene nada que ver con la pregunta real. Además, como esta pregunta es antigua y tiene una respuesta aceptada, su respuesta debe explicar algo útil que no se explica en las otras respuestas. –

+0

Esta es la respuesta personal de Jeff a "cómo crear un nuevo lienzo para extraer la imagen dentro de una etiqueta img sin descargarla de nuevo", pero no relacionada con la pregunta. Usualmente se usa para obtener imágenes png o cadenas base64 para manipularlas. Usualmente visto en captchas. Una mirada rápida aquí http://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_canvas_drawimage – erm3nda

Cuestiones relacionadas