【问题标题】:Simpliflying jQuery calls that use redundant data简化使用冗余数据的 jQuery 调用
【发布时间】:2012-10-04 03:08:51
【问题描述】:

我有一些代码可以控制一些 divs,但它会重复很多次,只是为了在不同的链接上做一点小改动

如果我点击#Option1 然后 2-5 缩小到 0(如果它们中的任何一个是打开的)并转到 0 不透明度 反之亦然,如果您单击 2(折叠 1 和其余部分),但我想不出一种使它更通用的好方法,但必须有一种方法

$('#Option1').click(function() {
      var ele = $('#Option1Div');
      ele.animate({
               opacity    : .75,
               width      : '602px'
          }, 5000, function() {
          // Animation complete.
  });
      var ele = $('#Option2Div');
      ele.animate({
               opacity    : 0.1,
               width      : '0px'
          }, 5000, function() {
          // Animation complete.
  });
      var ele = $('#Option3Div');
      ele.animate({
               opacity    : 0.1,
               width      : '0px'
          }, 5000, function() {
          // Animation complete.
  });
      var ele = $('#Option4Div');
      ele.animate({
               opacity    : 0.1,
               width      : '0px'
          }, 5000, function() {
          // Animation complete.
  });
      var ele = $('#Option5Div');
      ele.animate({
               opacity    : 0.1,
               width      : '0px'
          }, 5000, function() {
          // Animation complete.
  });
});

【问题讨论】:

    标签: jquery function redundancy


    【解决方案1】:

    你可以试试这个

      $('#Option1 , #Option2 ,#Option3 , #Option4 , #Option5').click(function() {
        var ele = $('#' + this.id + 'Div');
        ele.animate({
            opacity: .75,
            width: '602px'
        }, 5000, function() {
            // Animation complete.
        });
    
        $('[id^="Option"][id$="Div"]').not(ele).animate({
            opacity: 0.1,
            width: '0px'
        }, 5000, function() {
            // Animation complete.
        });
    });
    

    【讨论】:

    • 这很优雅,但我可以更清洁吗?因为单击说选项 2 将 Option2Div 不透明度设置为 0.75,宽度设置为 602,同时将 1(和 3-5)减少到 0
    • 试试上面粘贴的代码。它会处理 5 个选项 div 的所有点击事件
    • 那是完美的。非常有效率!谢谢
    【解决方案2】:

    如果你给你的选项一个options 的类,你的div 一个option-divs 的类,你可以使用这样的东西:

    $('.options').click(function() {
        var element = $('.option-divs').eq($(this).index());
    
        element.stop().animate({
            opacity: .75,
            width: '602px'
        }, 5000).siblings().stop().animate({
            opacity: 0.1,
            width: '0px'
        }, 5000);
    });​
    

    【讨论】:

    • 所有好主意,但第一个似乎很简单,但看看也许它可以更高效tokusatsu.lurkerlordx.com/prototype.html
    • @NekoLLX:您使用的方法不是很好。 ids 不应该这样使用。
    • 你能解释一下为什么吗?我的意思是没有什么是多余的,它们只使用一次,所以 ID 不是比 Classes 更可取的,尤其是当以后像内容 div 这样的东西会有不同的内容时
    • 我的意思是,如果它有效,它并没有什么问题,但通用解决方案允许您添加/删除 HTML 元素,而无需重写 JavaScript。
    • 嗯,这肯定更高效,我喜欢高效,也许我会试一试,我唯一真正担心的是当我在特定区域动态更改内容时,例如 OptionDivs、Subsection1 和标题
    【解决方案3】:

    从技术上讲,由于您对不透明度、宽度以及最终的动画持续时间有不同的值,因此您无法完成纯粹通用的工作。

    但您可以隔离数组中所有变化的数据并应用通用代码,例如:

        var opacities = [0.75, 0.1, 0.1, 0.1, 0.1];
        var widths = [602, 0, 0, 0, 0];
        var durations = [500, 500, 500, 500, 500];
        var callbacksComplete = [cb1, cb2, cb3, cb4, cb5];
    
        $('#Option1').click(function() {
    
            // Assume that 3 arrays have the same size !
            for(var i = 0 ; i < opacities.length ; i++)
            {
                $('#Option' + i + 'Div').animate({
                    'opacity' : opacities[i],
                    'width' : widths[i]
                }, durations[i], callbacksComplete[i]);
            }
        }
    

    【讨论】:

    • 我不需要它完全通用...只是比 5 个函数的 5 个调用更有效 Arry 看起来也不错
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多