En realidad, incluso usando image.onload = function() {}
, puede tener problemas. Use esta técnica (eso no es para nada lo que estoy diciendo), sino muévala al pie de la página.
Como ejemplo, tengo un sitio de redes sociales que utiliza un lienzo para mostrar la foto de perfil (URI almacenado en el DB), la imprime en lienzo y luego superpone un logotipo.
<section id="content">
<article id="personalbox" >
<h2>Hi! My name is {profile_name}</h2>
<a id="friendbutton" href=""><img src="views/default/images/friend.png" width="12" height="12" /><span>Add {profile_name} as a friend?</span></a>
<video id="profilevideo" width="240" height="144">DEBUG: Video is not supported.</video>
<canvas id="profilecanvas" width="240" height="144" >DEBUG: Canvas is not supported.</canvas>
<a id="gallerytextlink" href="gallery.html" >Click to visit {profile_name} Gallery</a>
<table id="profileinfotable1">
...
</section>
<script type="text/javascript">
function init() {
var cvs = document.getElementById("profilecanvas");
var ctx = cvs.getContext("2d");
var img = new Image();
img.src = "uploads/profile/{profile_photo}";
img.onload = function() {
// Ignore. I was playing with the photo.
ctx.drawImage(img, 42, 32, 186, 130, cvs.width/2 - (186-42)/2, cvs.height/2 - (130-32)/2, 186-42, 130-32);
drawLogo(cvs,ctx);
}
}
function drawLogo(cvs,ctx) {
var logo = "Enter Logo Here.";
ctx.fillStyle = "rgba(36,36,36,0.6)";
ctx.strokeStyle = "rgba(255,255,255,0.3)";
ctx.font = "bold italic 6pt Serif";
ctx.textAlign = "left";
ctx.textBaseline = "middle" ;
ctx.save();
ctx.strokeText(logo, 4, cvs.height-11);
ctx.strokeText(logo, 6, cvs.height-11);
ctx.strokeText(logo, 4, cvs.height-9);
ctx.strokeText(logo, 6, cvs.height-9);
ctx.fillText(logo, 5, cvs.height-10);
ctx.restore();
}
window.onload = init;
</script>
Idealmente, esto sería ir hasta el final en la parte inferior antes de la etiqueta final </body>
, pero me lo puso más alta debido a mi sistema de plantillas. Aparentemente, esto le da a la imagen tiempo para cargarse después de que el elemento de lienzo se haya dibujado en la pantalla y esté listo para recibir datos.
No puedo confiar en establecer el fondo del lienzo, y no tengo ganas de lidiar con las actualizaciones. Por alguna razón, solo incluir el script con img.onload = function() {}
no fue suficiente. Muévala más abajo y ahórrese los dolores de cabeza.
Gracias. Sabía que era algo simple. –