Skip to content Skip to sidebar Skip to footer

Why Doesn't Image Show On Load, But Shows On Refresh?

I'm playing with the canvas element in HTML5 and I have noticed a peculiar behavior. On initial load, an image I'm displaying does not show. However, when I refresh the browser, i

Solution 1:

Images load asynchronously, so only after refresh it loads early enough because it's cached. Normally it isn't loaded yet at the time you call drawImage. Use onload:

var image = newImage();
image.src = "Images/smiley.png";
image.onload = function() {
    context.drawImage(image, 50, 50);
};

Solution 2:

This happened with me as well (only for IE9 for me) anyways, i found a simple solution.

Set the background of the canvas to the initial image you wish to display.

var canvas = document.getElementById("canvas");
canvas.style.background="url('image.png')";

That should work!

Solution 3:

Actually, even just using image.onload = function() {}, you can still run into problems. Do use this technique (that's not at all what I'm saying), but move it to the bottom of your page.

As an example, I have a social networking site that uses canvas to show the profile photo (URI stored to the DB), and print it to canvas, then overlay a logo.

<sectionid="content"><articleid="personalbox" ><h2>Hi! My name is {profile_name}</h2><aid="friendbutton"href=""><imgsrc="views/default/images/friend.png"width="12"height="12" /><span>Add {profile_name} as a friend?</span></a><videoid="profilevideo"width="240"height="144">DEBUG: Video is not supported.</video><canvasid="profilecanvas"width="240"height="144" >DEBUG: Canvas is not supported.</canvas><aid="gallerytextlink"href="gallery.html" >Click to visit {profile_name} Gallery</a><tableid="profileinfotable1">

...

</section><scripttype="text/javascript">functioninit() {
    var cvs = document.getElementById("profilecanvas");
    var ctx = cvs.getContext("2d");
    var img = newImage();
    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);
    }
  }

  functiondrawLogo(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>

Ideally, this would go all the way at the bottom before the end </body> tag, but I put it up higher because of my template system. Apparently, this gives the image time to load after the canvas element has been drawn to the screen and is ready to receive input.

I can't rely on setting the background of the canvas, and I have no desire to contend with refreshes. For whatever reason, just including the script with img.onload = function() {} was not enough. Move it lower, and save yourself the headaches.

Post a Comment for "Why Doesn't Image Show On Load, But Shows On Refresh?"