2013-11-15 180 views
0

我已經創建了2個對象。一個創建一個畫布對象並將其附加到html的主體,另一個應繪製一個不是的矩形。我究竟做錯了什麼?不會在畫布上繪製矩形

window.onload = function(){ 


    var oCanvas = { 

     canvas : document.createElement("canvas"), 
     ctx : document.createElement("canvas").getContext("2d"), 

     create : function(){ 
      oCanvas.canvas.id = "canvas"; 
      oCanvas.canvas.width = 350; 
      oCanvas.canvas.height = 350; 
      oCanvas.canvas.style.background = "yellow"; 
      document.body.appendChild(oCanvas.canvas); 

     } 
    }; 
    var oMap = { 
     createGrid : function(){ 
      oCanvas.ctx.fillRect(50, 25, 150, 100); 
     } 
    }; 

    oCanvas.create(); 
    oMap.createGrid(); 

}; 
+1

您將創建兩個不同的畫布.. – K3N

回答

1

您正在創建兩個單獨的畫布。在定義ctx屬性時,應參考之前創建的canvas屬性。從對象定義中刪除ctx,並將其添加時,一旦對象已經定義:

var oCanvas = { 

    canvas : document.createElement("canvas"), 
    ... 
} 
oCanvas.ctx = oCanvas.canvas.getContext("2d"); 
+0

這不會爲'this.canvas'沒有在規定的工作這點。 http://jsfiddle.net/AbdiasSoftware/42qrA/ – K3N

+0

@KenFyrstenberg我也沒有想到它的工作,但在jsfiddle上測試它,它第一次工作。奇怪。 – matewka

+0

我在控制檯FF中得到'TypeError:this.canvas未定義',Uncaught TypeError:在Chrome中無法調用未定義的方法'getContext',在你的無錯誤? – K3N

0

更新:看來我是打了,這是一個更好的解決方案:https://stackoverflow.com/a/20009730/1634430

你正在創建2種元素,並畫錯了。解決方案在這裏:http://codepen.io/zshift/pen/gxoEA。的

代替

... 
canvas : document.createElement("canvas"), 
ctx : document.createElement("canvas").getContext("2d"), 
... 

你應該寫

var element = document.createElement("canvas"); 

... 
canvas: element, 
ctx: element.getContext("2d"), 
... 
2

要使用自引用,你可以做到這一點,而不是這樣的方法 -

  • 與構造函數創建一個對象相反 - 否則在對象分配給va之後,您將無法引用其定義可引起錯誤。
  • 使用new關鍵字創建對象的新實例。

現在,您可以通過使用例如原型進一步改進它,但是爲了簡單:

function myCanvas() { 

    /// create a reference to ourselves (saves us some headache later) 
    var me = this; 

    /// create a canvas as a property on this instance 
    this.canvas = document.createElement("canvas"); 

    /// now this.canvas exists and we can get the context 
    this.ctx = this.canvas.getContext("2d"), 

    /// metod create which references 'me' 
    this.create = function(){ 
     me.canvas.id = "canvas"; 
     me.canvas.width = 350; 
     me.canvas.height = 350; 
     me.canvas.style.background = "yellow"; 
     document.body.appendChild(me.canvas); 
    } 
}; 

/// create an instance (you can create several of this) 
var oCanvas = new myCanvas(); 

現在將作爲你can see in this demo

+0

那麼,這正是我想用對象符號來實現的,就像你看到的那樣,結果很糟糕。我也儘管按照你的方式做,但不想把OP與'新的Canvas()'東西等混淆+作爲你的答案。我會選這個。 – matewka

+0

謝謝@matewka。我添加了一些更多的評論,希望可以讓OP的變化更加清晰。 – K3N

+0

是的,我看到了他們。良好的工作;) – matewka

0

如果這是一個單獨的對象,您可以將它保留爲對象字面值,但如果要創建多個實例,則可以使用構造函數和原型。對構造函數和原型的介紹可以在here找到。

假設有隻使用一個oCanvas例如,您可以更改您的代碼:

var oCanvas = { 

    canvas : document.createElement("canvas"), 
    ctx : null,/can't set it to anything yet 
      //oCanvas doesn't exist yet here 

    create : function(){ 
     oCanvas.canvas.id = "canvas"; 
     oCanvas.canvas.width = 350; 
     oCanvas.canvas.height = 350; 
     oCanvas.canvas.style.background = "yellow"; 
     document.body.appendChild(oCanvas.canvas); 
     //set the context now 
     this.ctx = this.canvas.getContext("2d"); 
    } 
}; 
var oMap = { 
    createGrid : function(){ 
     oCanvas.ctx.fillRect(50, 25, 150, 100); 
    } 
}; 

oCanvas.create(); 
oMap.createGrid();