2010-11-15 60 views
0

错误:未捕获的异常:[异常...]组件返回失败代码:0x80040111(NS_ERROR_NOT_AVAILABLE)[nsIDOMCanvasRenderingContext2D.drawImage]“nsresult:”0x80040111(NS_ERROR_NOT_AVAILABLE)“location:”JS frame: :http://127.0.11.1/test/canvas5_b.php :: setup :: line 27“data:no]来自简单代码的javascript/canvas5错误

function setup() { 

    var e = document.getElementById("mycanvas"); 
    var ctx = e.getContext('2d'); 


    var meter = new Image(); 
    meter.src = "meter.jpg"; 
    var meter_bar = new Image(); 
    meter_bar.src = "meter_bar.jpg"; 
    //alert(meter); 

    ctx.beginPath();/////////LINE 27//////////// 
    ctx.drawImage(meter, 50, 100); 
    //ctx.globalCompositeOperation = "lighter"; 
    ctx.drawImage(meter_bar, 68, 123); 
    ctx.closePath(); 


} 

window.onload = setup; 

这两个图像都在正确的文件夹中。让我感到惊奇的是,如果你放了一个警报(米),它就会起作用。在第27行之前。就好像它没有加载,但我已经在window.onload上运行了,所以我没看到那是怎么回事。

编辑:这是一个图像加载时的问题(ty rob)。看来最好的在全球范围内宣布并设置图片src,然后调用的window.onload =设置,如:(纠正我,如果这是不好的)

var img1, img2; 
img1 = new Image(); 
img2 = new Image(); 
//declare and set the images src 
img1.src = "meter.jpg"; 
img2.src = "meter_bar.jpg"; 

var canvasHeight, canvasWidth; 
canvasHeight = 300; 
canvasWidth= 600; 

var ctx; 


function setup() { 
    var e = document.getElementById("mycanvas"); 
    ctx = e.getContext('2d'); 
    draw(); 
} 

function draw() { 
    ctx.clearRect(0,0,canvasWidth, canvasHeight); 
    ctx.beginPath(); 
    ctx.drawImage(img1, 50, 100); 
    ctx.drawImage(img2, 68, 123); 
    ctx.closePath(); 
} 

window.onload = setup; 

回答

2

确保图像首先加载。例如:

var img = new Image(); 
img.onload = function(){ 
    ctx.drawImage(img,0,0); 
    } 

// put this after onload, otherwise onload may 
// not be called if image is in cache 
img.src = 'whatev.png'; 
+0

我以为img.onload不会在img.src之后触发,因为它已经加载。将不得不测试这一点。 – jason 2010-11-15 21:13:51

+0

我刚刚重新安排它以解决这个问题。 – rob 2010-11-15 21:16:18

0

这可能是由alert引入的延迟是足以让图像加载,但没有alert,图像没有及时装载。尝试仅在图像加载后将图像绘制到画布上:

function setup() { 

    function maybeDraw() { 
     this.loaded = true; 
     if(meter.loaded && meter_bar.loaded) { 
      ctx.beginPath(); 
      ctx.drawImage(meter, 50, 100); 
      //ctx.globalCompositeOperation = "lighter"; 
      ctx.drawImage(meter_bar, 68, 123); 
      ctx.closePath(); 
     } 
    } 

    var e = document.getElementById("mycanvas"); 
    var ctx = e.getContext('2d'); 

    var meter = new Image(); 
    var meter_bar = new Image(); 
    meter.onload = maybeDraw; 
    meter_bar.onload = maybeDraw; 
    meter.src = "meter.jpg"; 
    meter_bar.src = "meter_bar.jpg"; 

} 

window.onload = setup; 
+0

MaybeDraw会被调用2次吗?或者在第一次尝试失败,因为其他图像尚未加载? – jason 2010-11-15 21:50:00

+0

@jason:是的,它会被调用两次,但if语句会检查两个图像是否已加载。 (当maybeDraw运行时,它会设置'meter.loaded = true;'或'meter_bar.loaded = true;',这取决于它是哪一个。) – PleaseStand 2010-11-15 21:53:27

+0

ahh我看到你在那里做了什么。那么,如果一个bajillion图像加载...我想一种方法来做到这一点将设置最后一个加载的图像,并在其onload,调用maybeDraw(),但我怀疑,在某些情况下wouldnt工作,并且它的certianly不优雅。 – jason 2010-11-15 22:20:45