2011-07-10 111 views
2

我想要做的就是這個JavaScript函數參數

$.each($(".canvas"), function(n) { 
     var canvas = $(this)[0].getContext("2d");  
     canvas.drawImage(options[n]); 
    }); 

其中options是參數數組,但無法弄清楚如何應陣列被格式化爲它工作

顯然不是

['img, 0, 0, 70, 17, 21, 16, 70, 17', 'img, 0, 0, 80, 12, 21, 16, 70, 17'] 

這既不

[''+img+', 0, 0, 70, 17, 21, 16, 70, 17', ''+img+', 0, 0, 80, 12, 21, 16, 70, 17'] 

也不是這

{0: [img, 0, 0, 70, 17, 21, 16, 70, 17]} 

這不會工作,要麼

var options = [[img, 0, 0, 70, 17, 21, 16, 70, 17], 
       [img, 0, 16, 70, 17, 21, 16, 70, 17], 
       [img, 0, 32, 70, 17, 21, 16, 70, 17], 
       [img, 0, 48, 70, 17, 21, 16, 70, 17]]; 

img.onload = function() { 
    $.each($(".canvas"), function(n) { 
     var canvas = $(this)[0].getContext("2d");  
     canvas.drawImage(options[n].join(', ')); 
    }); 
}; 

錯誤常是遺漏的類型錯誤:類型錯誤或遺漏的類型錯誤:非法調用

+1

'drawImage'需要幾個參數,而不僅僅是一個是一個字符串。 'foo(a,b)'與'foo('a,b')'不同。只是因爲字符串中有一個逗號沒有使它成爲參數列表。 –

回答

4

使用Function.apply

canvas.drawImage.apply(canvas, options[n]); 

options[n]看起來像

[img, 0, 0, 70, 17, 21, 16, 70, 17] 

完整的示例:

var options = [[img, 0, 0, 70, 17, 21, 16, 70, 17], 
       [img, 0, 16, 70, 17, 21, 16, 70, 17], 
       [img, 0, 32, 70, 17, 21, 16, 70, 17], 
       [img, 0, 48, 70, 17, 21, 16, 70, 17]]; 

$(img).load(function() 
{ 
    $(".canvas").each(function(n) 
    { 
     var canvas = this.getContext('2d');  
     canvas.drawImage.apply(canvas, options[n]); 
    }); 
}); 

演示:http://jsfiddle.net/mattball/5EQbC/

+0

'options'必須有合理的結構雖然。而'img'必須是一個DOM元素afaik。 –

+0

http://jsfiddle.net/w7MF7/ 未捕獲的類型錯誤:非法調用 – foxx

+2

@foxx:必須使用'canvas.drawImage.apply(帆布,期權[N]);'(通過'canvas'作爲第一個參數) 。 –