2011-10-11 53 views
0

我以前曾與Raphael一起工作過,但我已經返回到我的項目並決定完全重新編寫它以提高性能和一般代碼質量。無論如何,應用程序使用Raphael創建思維導圖(如果您已閱讀我以前的問題,您將對整個應用程序有更多的瞭解)。從ZPD插件存儲變量中的Raphael對象

因此,我使用paper.circle()等在畫布上創建節點,並避免使用.drag()的不必要的工作。我決定使用Raphael ZPD plugin。這個插件太複雜了,我不能完全理解,但我打算輕微編輯它。 我想將活動節點存儲在變量_node中。要做到這一點,我認爲這將如獲得evt.target並分配它一樣簡單,但顯然不是。

這裏是插件(位,我覺得作業應該走)的一部分:

/** 
* Handle mouse button release event. 
*/ 
me.handleMouseUp = function(evt) { 
    if (evt.preventDefault) 
     evt.preventDefault(); 

    evt.returnValue = false; 

    var svgDoc = evt.target.ownerDocument; 

    if ((me.state == 'pan' && me.opts.pan) || (me.state == 'move' && me.opts.drag)) { 
     // Quit pan mode 
     me.state = ''; 
    } 
}; 

當使用alert(evt.target);(點擊圓圈時)我給:

[對象SVGCircleElement]

這意味着evt.target越來越各個元件(如它更改爲其它形狀),但第嘗試在分配失敗後操作_node。我得到一個錯誤信息:

_node.attr不是一個函數

(我試圖改變ATTR(),因爲這是最簡單的功能)。

我已經嘗試了許多使用節點,evt.target,evt.currentTarget等的變體,但我確信我只是缺少一些與evt.target有關的東西,因爲它會在警報中產生正確的輸出。

據我所知,me.是在代碼的其他地方定義的,所以如果你需要(看起來比發佈完整的插件更好),請查看上面的鏈接。

我會很感激任何幫助,你可以給。

謝謝。

更新:我現在100%肯定它是evt.target,我應該在_node被存儲,但它似乎有SVG,DOM和拉斐爾之間沒有直接的聯繫。關於如何將SVG元素鏈接回Raphael的任何想法?

回答

1

我上週開始使用這個插件,並且遇到了同樣的問題。

我能夠將SVG形狀鏈接回形狀的拉斐爾手柄。

基本上,您首先必須維護一個指向與zpd插件對象綁定的raphael紙張對象的指針。我通過在var opts = {...之後創建一個raphPaper聲明來做到這一點。}線

var raphPaper = null; 

因此,raphPaper對象將像opts對象一樣可用。

當拉斐爾創建一個形狀,它分配兩個變量(我發現):.raphael和.raphaelid .raphael是一個布爾告訴我們SVG形狀是否被拉斐爾創建,.raphaelid給我們是SVG形狀的raphael內部標識。所以,要獲得raphael元素,我們只需在紙張對象(raphPaper)上使用getById。

if(evt.target.raphael){ 
    var raphShp = raphPaper.getById(evt.target.raphaelid); 
} 

因此,對於您的問題,您只需將raphShp分配給_node或任何想要訪問的變量。

相關問題