2012-10-12 34 views
0

的,我有以下的html代碼:如何調用基於類的一組變量函數的一組元素

<i class="small ele class1"></i> 
<i class="medium ele class1"></i> 
<i class="large ele class1"></i> 

<div class="clear"></div> 

<i class="small ele class2"></i> 
<i class="medium ele class2"></i> 
<i class="large ele class2"></i> 

<div class="clear"></div> 

<i class="small ele class3"></i> 
<i class="medium ele class3"></i> 
<i class="large ele class3"></i> 

<div class="clear"></div> 

<i class="small ele class4"></i> 
<i class="medium ele class4"></i> 
<i class="large ele class4"></i>​ 

而且我的JavaScript看起來像這樣:

var resize = function(face, s) { 
    var bb = face.getBBox(); 
    console.log(bb); 
    var w = bb.width; 
    var h = bb.height; 
    var max = w; 
    if (h > max) { 
     max = h; 
    } 
    var scale = s/max; 
    var ox = -bb.x+((max-w)/2); 
    var oy = -bb.y+((max-h)/2); 

    console.log(s+' '+h+' '+bb.y); 

    face.attr({ 
     "transform": "s" + scale + "," + scale + ",0,0" + "t" + ox + "," + oy 
    }); 

} 

$('.ele').each(function() { 
    var s = $(this).innerWidth(); 
    var paper = Raphael($(this)[0], s, s); 

    var face = $(this).hasClass("class1") ? class1Generator(paper) : class4Generator(paper); 


    /*switch (true) { 
     case $(this).hasClass('class1'): 
      class1Generator(paper); 
     break; 

     case $(this).hasClass('class2'): 
      class2Generator(paper) 
      break; 

     case $(this).hasClass('class3'): 
      class3Generator(paper)  
      break; 

     case $(this).hasClass('class4'): 
      class4Generator(paper) 
      break; 
    }*/ 


    resize(face, s); 

}); 

我的問題是,我怎麼能讓這行代碼更具可擴展性?我嘗試使用開關,但 下面的腳本是調用兩個函數,如果其中一個元素有一個類,但是如果我有10個類? 我不認爲是我創建了一個的jsfiddle http://jsfiddle.net/7uUgz/6/

//var face = $(this).hasClass("awesome") ? awesomeGenerator(paper) : awfulGenerator(paper); 
+0

如果您的代碼工作,你只是想改善它,應該是http://codereview.stackexchange.com/ – RASG

回答

1

Try this fiddle

最佳的解決方案基本上它提取從「類#」的數量,並調用相應的功能。

$('.ele').each(function() { 
    var s = $(this).innerWidth(); 
    var paper = Raphael($(this)[0], s, s); 
    var id = 0; 


    var classList = $(this).attr('class').split(/\s+/); 
    $.each(classList, function(index, item) { 
     if (item.indexOf('class') != -1) { 
      id = item.replace('class', ''); 
      console.log('id : ' + id); 
     } 
    }); 

    var face = eval('class' + id + 'Generator')(paper); 
    resize(face, s); 

}); 

而不是使用的Class1,Class2中......,你可以只使用一個數據屬性和讀取,當你需要調用函數..

喜歡的東西:

<i data-id="1" class="small ele class1"></i> 

爲什麼你使用<i>元素?

+0

我的壞,當我張貼的最後一行,它並沒有顯示 。現在我的短語更有意義。 –

+0

我基本上創建了一個圖標家族,類似於http://fortawesome.github.com/Font-Awesome/,我認爲有意義的做而不是就像他們:) – user1547007

1

如果您想避免使用eval(),您可以將一些自定義事件綁定到生成類。

$(".class1").bind("generate", function(paper) 
{ 
    ... 
}); 
$(".class2").bind("generate", function(paper) 
{ 
    ... 
}); 

$(".ele").trigger("generate"); 
+0

聰明!我喜歡。我的答案使用了eval(),但通常我會盡量避免! –

相關問題