2012-04-30 140 views
2

我剛開始使用Raphael.js,並且難以將一個id添加到路徑中。我已經閱讀了很多關於如何做的文章,但我認爲我的文件設置方式不允許我輕鬆地翻譯這些解決方案。raphael.js如何將id添加到路徑

我有一個init.js文件和文件path.js

init.js

var r = Raphael('man', 500, 573), 
    attributes = { 
     fill: '#204ad3', 
     opacity: '0.0', 
     'stroke-linejoin': 'round' 

    }, 
arr = new Array(); 

for (var muscles in paths) { 

    var obj = r.path(paths[muscles].path); 

    obj.attr(attributes); 

    arr[obj.id] = muscles; 

    obj 
    .hover(function(){ 
     this.animate({ 
      fill: '#204ad3', 
      opacity: '0.3' 
     }, 300); 
    }, function(){ 
     this.animate({ 
      fill: attributes.fill, 
      opacity: attributes.opacity 
     }, 300); 
    }) 
    .click(function(){ 
     document.location.hash = arr[this.id]; 

     var point = this.getBBox(0); 

     $('#man').next('.point').remove(); 

     $('#man').after($('<div />').addClass('point')); 

     $('.point') 
     .html(paths[arr[this.id]].name) 
     .prepend($('<a />').attr('href', '#').addClass('close').text('Close')) 
     .prepend($('<img />').attr('src', 'flags/'+arr[this.id]+'.png')) 
     .css({ 
      left: point.x+(point.width/2)-80, 
      top: point.y+(point.height/2)-20 
     }) 
     .fadeIn(); 

    }); 

    $('.point').find('.close').live('click', function(){ 
     var t = $(this), 
      parent = t.parent('.point'); 

     parent.fadeOut(function(){ 
      parent.remove(); 
     }); 
     return false; 
    }); 
} 

path.js文件:

var paths = { 
    neck: { 
     name: 'Neck', 
    path: 'd="M412.294,73.035c0,0,7.661,28.869,9.406,31.78c1.746,2.911,4.657,2.911,9.896,2.911 s9.313-1.746,9.896-5.239c0.582-3.493,6.985-28.523,6.985-28.523s-2.963,2.599-6.232,5.984c-2.543,2.632-7.2,5.904-11.088,5.904 c-3.889,0-6.705-2.431-10.367-5.04C418.063,78.868,418.08,79.22,412.294,73.035z"', 
}, 
pecks: { 
    name: 'Pecks', 
    path: 'd="M379.581,117.994c0,0,0.396-1.586,6.936-4.558c6.539-2.972,13.475-5.351,16.844-6.737 c3.369-1.387,4.559-1.784,4.559-1.784s13.674,2.973,15.061,3.17c1.387,0.198,4.36,1.982,8.72,1.982s9.511-1.387,11.097-2.18 s10.307-2.973,11.693-3.171s1.387-0.198,1.387-0.198s12.286,3.369,16.845,4.36c4.558,0.991,8.917,2.378,9.116,3.765 c0.197,1.387,1.584,4.954,1.584,6.341s-0.197,5.945-0.396,6.738c-0.198,0.792-3.171,15.457-4.757,21.997 c-1.585,6.54-1.188,8.918-7.331,11.494s-10.899,7.53-22.79,2.378s-13.277-5.549-17.241-5.152s-11.098,3.963-14.862,5.351 c-3.766,1.387-16.251,2.179-20.412-0.198c-4.162-2.378-10.9-9.314-12.881-16.844c-1.981-7.531-3.963-16.052-4.359-17.638 C377.995,125.525,377.798,121.165,379.581,117.994z"', 
}, 
} 

生成SVG元件不具有一個ID,我也不知道如何在那裏得到一個。任何意見/幫助將不勝感激。

回答

5

這將id屬性添加到SVG路徑元素:

var id = 0; 

for (var muscles in paths) { 

    var obj = r.path(paths[muscles].path); 
    obj.node.id = "muscles_or_whatever_you_want_" + id; 
    id++ 

    //.... 
+0

這工作完美。謝謝! – whildkatz

+0

我想添加一些東西到會顯示或隱藏div的基於每個路徑的點擊事件。所以這個類將會是.tag-(某些地方)(某些地方)會改變爲路徑的名稱。那可能嗎?目前彈出使用路徑名稱來添加肌肉名稱。不知道如何使用類似的東西來實現我提到的:'$('。tag-something')。show();' – whildkatz

+0

你試圖去做什麼有點不清楚。我會建議發佈另一個問題。如果您創建類名稱的方式可能與創建id相同。 – mihai

0

它看起來像你試圖做的是彈出一個圖像和單擊路徑上方的關閉鏈接的div。問題在於,您將路徑對象的Raphael ID與paths陣列中的索引混淆在一起。你可能想消除arr完全通過一個封閉的索引傳遞到您的處理程序:

.click(function(index) { return function() { 
    document.location.hash = index; 

    var point = this.getBBox(0); 

    $('#man').next('.point').remove(); 

    $('#man').after($('<div />').addClass('point')); 

    $('.point') 
    .html(paths[index].name) 
    .prepend($('<a />').attr('href', '#').addClass('close').text('Close')) 
    .prepend($('<img />').attr('src', 'flags/'+index+'.png')) 
    .css({ 
     left: point.x+(point.width/2)-80, 
     top: point.y+(point.height/2)-20 
    }) 
    .fadeIn(); 

}; }(muscles)); 
+0

謝謝你的回覆。我將應用這些調整,看看會發生什麼。我不確定您的解決方案是否在路徑元素中添加了一個ID。這一點很重要,不是彈出窗口,而是控制svg外的元素。 – whildkatz

+0

我希望能夠控制一組隱藏和顯示取決於點擊的肌肉組的dl元素。在使用沒有Rafael的SVG之前,我已經設置了這個部分。如果我能夠使用此設置爲一個路徑分配一個ID,比我會非常高興。可能嗎? – whildkatz

1

一個ID添加到SVG元素.... paper.path(path data).node.id = 'pathIdString';。測試...試試alert(document.getElementById("pathIdString").id);。應該返回ID

+0

這對我來說很合理,因爲它更容易理解。現在我可以很好地應用CSS。謝謝 – 2014-04-23 11:02:24