2012-01-12 55 views
10

我正在使用Raphael.js。每次我加載頁面我得到一條錯誤:變量拋出'undefined'錯誤,無法計算出

con is undefined 
x = con.x 

我拉斐爾文件中擡起頭來con,這是我發現:

var con = R._getContainer.apply(0, arguments), 
    container = con && con.container, 
    x = con.x, 
    y = con.y, 
    width = con.width, 
    height = con.height; 
    //... 

con顯然這裏定義。這裏是我想加載的代碼:

var paper = new Raphael(ele('canvas_container'), 500, 500); 

window.onload = function() { 
      var circle = paper.circle(100,100,100); 
      for (i = 0; i < 5; i++) { 
       var multiplier = i * 5; 
       paper.circle(250 + (2 * multiplier), 100 + multiplier, 50 - multiplier); 
      } 
    } 

是否有其他人得到這個錯誤?這是拉斐爾版本中存在的缺陷,還是存在其他一些問題?

+1

你確定'ele('canvas_container')'返回你認爲它是什麼嗎? – Dennis 2012-01-12 16:34:01

+0

@ Dennis--這就是它:'function ele(id){ \t \t return document.getElementById(id); \t}' – dopatraman 2012-01-12 16:35:21

+0

我猜'paper'是一個全局變量。因此,JS將在DOM準備好之前進行評估;因此'document.getElementById(「canvas_container」)'不會返回你所期望的。 – jabclab 2012-01-12 16:36:51

回答

10

嘗試移動的文件實例化你的窗口的負荷函數中:

window.onload = function() { 
    var paper = new Raphael(ele('canvas_container'), 500, 500); 
    var circle = paper.circle(100,100,100); 
    for (i = 0; i < 5; i++) { 
     var multiplier = i * 5; 
     paper.circle(250 + (2 * multiplier), 100 + multiplier, 50 - multiplier); 
    } 
} 

如果試圖通過其ID獲取元素之前DOM已準備就緒,getElementById將不會返回任何東西。正如你所看到的here,在一個空文件上試試你的代碼顯示了相同的結果。

1

Raphael.js預計在頁面上會出現一個硬編碼的HTML元素,其中包含Raphael畫布的名稱(即:「canvas_container」)。如果HTML元素是在運行時(在JavaScript代碼中動態創建的)創建的,則會拋出此錯誤。

R._engine.create = function() { 
    var con = R._getContainer.apply(0, arguments), 
     container = con && con.container, 
     x = con.x, 
     y = con.y, 
     width = con.width, 
     height = con.height; 
    if (!container) { 
     throw new Error("SVG container not found."); 
    } 
    var cnvs = $("svg"), 
     css = "overflow:hidden;", 
     isFloating; 
    x = x || 0; 
    y = y || 0; 
    width = width || 512; 
    height = height || 342; 
    $(cnvs, { 
     height: height, 
     version: 1.1, 
     width: width, 
     xmlns: "http://www.w3.org/2000/svg" 
    }); 
    if (container == 1) { 
     cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px"; 
     R._g.doc.body.appendChild(cnvs); 
     isFloating = 1; 
    } else { 
     cnvs.style.cssText = css + "position:relative"; 
     if (container.firstChild) { 
      container.insertBefore(cnvs, container.firstChild); 
     } else { 
      container.appendChild(cnvs); 
     } 
    } 
    container = new R._Paper; 
    container.width = width; 
    container.height = height; 
    container.canvas = cnvs; 
    container.clear(); 
    container._left = container._top = 0; 
    isFloating && (container.renderfix = function() {}); 
    container.renderfix(); 
    return container; 
};