【问题标题】:Suggestions to make this jQuery function more DRY / more efficient使这个 jQuery 函数更干/更高效的建议
【发布时间】:2020-11-12 01:17:21
【问题描述】:

按照previous post,此代码可以正常工作,但我知道这在潮湿的日子里就像太平洋一样干燥。

我很感激任何可以提高效率的建议。

$( "#cvl_mb_services .content-switch" ).each(function(index, el) {
    var parent        = $(el).parent().parent().attr("id");
    var inputValue    = $('#' + parent + ' input[type=radio]:checked').val();
    var targetBox   = '#' + parent + ' .cvl-' + inputValue + '-fields';

    $(targetBox).removeClass('cvl-hide');
});


$('#cvl_mb_services .content-switch').on('click', 'input[type="radio"]', function(){

    var parent      = $(this).parent().parent().parent().parent().parent().parent().attr("id");
    var inputValue  = $(this).closest('input[type="radio"]').attr("value");
    var targetBox   = '#' + parent + ' .cvl-' + inputValue + '-fields';

    if (inputValue == 'content') {
        $('#' + parent + ' .cvl-content-fields').removeClass('cvl-hide');
        $('#' + parent + ' .cvl-header-fields').addClass('cvl-hide');
        $('#' + parent + ' .cvl-footer-fields').addClass('cvl-hide');
    } else if (inputValue == 'header') {
        $('#' + parent + ' .cvl-content-fields').addClass('cvl-hide');
        $('#' + parent + ' .cvl-header-fields').removeClass('cvl-hide');
        $('#' + parent + ' .cvl-footer-fields').addClass('cvl-hide');
    } else if (inputValue == 'footer') {
        $('#' + parent + ' .cvl-content-fields').addClass('cvl-hide');
        $('#' + parent + ' .cvl-header-fields').addClass('cvl-hide');
        $('#' + parent + ' .cvl-footer-fields').removeClass('cvl-hide');
    }

});

【问题讨论】:

  • 我投票结束这个问题,因为它属于codereview.stackexchange.com
  • 几个可能的改进:DOM 导航总是最慢的,所以缓存任何 DOM 查找,例如var parent = $("#" + $(this).parent()....attr("id")); parent.find(".cvl-content-fields, .cvl-header-fields).addClass。使用.closest() 而不是.parent().parent().parent(),这样它就不会那么脆弱了。合并类更改(如我之前所示)。但这些都是微小的改进,不会对 click 处理程序产生太大影响 - 如果您的运行代码每秒运行 1000 次,您会注意到。

标签: javascript jquery performance dry


【解决方案1】:

几个点让它更干:

  1. 只使用一个var 关键字,并用逗号分隔各项。前任。 var asdf = 1, sdfg = '', dfgh = true;
  2. 使用多个选择器,以便您只应用一次.addClass 操作。见https://api.jquery.com/multiple-selector/
  3. 找到一种方法来消除这种重复,例如添加/使用一个类来选择正确的祖先:.parent().parent().parent().parent().parent().parent()
  4. 不要重复像'cvl-hide' 这样的字符串,而是创建一个变量。许多 JavaScript 压缩器不会接触字符串,因此您最终会遇到这种重复,从而使您的整个文件变得比实际需要的大。
  5. 为重复的选择器创建变量,这样 jQuery 就不必进行两次相同的查找。对于像 $('#cvl_mb_services .content-switch') 这样的东西,甚至对于像 $(this) 这样重复的东西。

【讨论】:

  • 另一种解决方案(这不是问题的直接答案,但可以解决用例)是更改 css,以便当您将类应用于父节点时, css 使对象隐藏和显示。那么你所要做的就是向 one 节点添加一个 CSS 类。这可能更有意义,也可能没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2017-03-27
  • 2019-10-10
相关资源
最近更新 更多