【问题标题】:How to call a set of variables functions based on class on a group of elements [closed]如何在一组元素上基于类调用一组变量函数[关闭]
【发布时间】:2012-10-12 03:01:27
【问题描述】:

我有以下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);

【问题讨论】:

标签: php javascript jquery html raphael


【解决方案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>

您为什么使用&lt;i&gt; 元素?

【讨论】:

  • 我的错,当我发布最后一行时,它没有显示 。现在我的短语更有意义了。
  • 我基本上是在创建一系列图标,类似于fortawesome.github.com/Font-Awesome,我认为这样做是有意义的 而不是 就像他们一样 :)
【解决方案2】:

如果您想避免使用eval(),您可以将一些自定义事件绑定到生成类。

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

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

【讨论】:

  • 聪明!我喜欢。我的答案使用了 eval() 但通常我会尽量避免!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多