【问题标题】:Multiple Selectors with same jquery具有相同jquery的多个选择器
【发布时间】:2018-07-25 12:25:04
【问题描述】:

我已经为一些靠近的元素编写了一些简单的 jquery。每个都工作得很好,但我希望能得到一些帮助,使我的 jquery 更高效,更小,以便放置在单独的 JS 文件中。我是 jQuery 的新手,并不真正知道如何结合我所写的内容。任何帮助是极大的赞赏!我的代码如下:

$('.fade-carousel').on('init', function(event, slick, currentSlide, nextSlide) {
  if ($('.slick-active .slide-container div').hasClass('intro-bg')) {
    $('#header').addClass('transparent-header')
  } else {
    $('#header').removeClass('transparent-header');
  }
  $('.fade-carousel').on('beforeChange', function(event, slick, currentSlide, nextSlide) {
    if ($('.slide-container:eq(' + nextSlide + ') > div').hasClass('intro-bg')) {
      $('#header').addClass('transparent-header')
    } else {
      $('#header').removeClass('transparent-header');
    }

  });
});
$('.fade-carousel').on('init', function(event, slick, currentSlide, nextSlide) {
  if ($('.slick-active .slide-container div').hasClass('intro-bg')) {
    $('.slick-arrow').removeClass('black-arrow')
  } else {
    $('.slick-arrow').addClass('black-arrow')
  }
  $('.fade-carousel').on('beforeChange', function(event, slick, currentSlide, nextSlide) {
    if ($('.slide-container:eq(' + nextSlide + ') > div').hasClass('intro-bg')) {
      $('.slick-arrow').removeClass('black-arrow')
    } else {
      $('.slick-arrow').addClass('black-arrow');
    }
  });
});
$('.fade-carousel').on('init', function(event, slick, currentSlide, nextSlide) {
  if ($('.slick-active .slide-container div').hasClass('intro-bg')) {
    $('.scroll-arrow i').removeClass('black-arrow')
  } else {
    $('.scroll-arrow i').addClass('black-arrow')
  }
  $('.fade-carousel').on('beforeChange', function(event, slick, currentSlide, nextSlide) {
    if ($('.slide-container:eq(' + nextSlide + ') > div').hasClass('intro-bg')) {
      $('.scroll-arrow i').removeClass('black-arrow')
    } else {
      $('.scroll-arrow i').addClass('black-arrow');
    }
  });
});
$('.fade-carousel').on('init', function(event, slick, currentSlide, nextSlide) {
  if ($('.slick-active .slide-container div').hasClass('video-intro')) {
    $('#header').addClass('transparent-header')
  }
  $('.fade-carousel').on('beforeChange', function(event, slick, currentSlide, nextSlide) {
    if ($('.slide-container:eq(' + nextSlide + ') > div').hasClass('video-intro')) {
      $('#header').addClass('transparent-header')
    }
  });
});

【问题讨论】:

  • 看起来您正在重复绑定,具有不同的内部条件和更改。没有什么说您不能在一个绑定中执行所有条件和逻辑。
  • 您能发布相关 HTML 的 sn-p 吗?在某些情况下,我们可以使用一些兄弟选择器或.closest() 来防止解析器每次都重新遍历 DOM。但是,要使其正常工作,我们需要知道您的轮播的结构...

标签: javascript jquery


【解决方案1】:

可以在工作的顶部预先计算 jquery 对象:

var $scrollArrowIcon = $('.scroll-arrow i');

然后用它来做类似的事情

$scrollArrowIcon.addClass('whatever');
$scrollArrowIcon.removeClass('something_else');

这里的一个风险是,当您的点击处理程序运行时,与该选择器匹配的实际元素集可能已经改变,并且您的 jQuery 对象将只包含您创建它时存在的 DOM 元素。

您可以利用 jquery 链接 (http://www.jquery-tutorial.net/introduction/method-chaining/) 改进现有代码...例如

$('.fade-carousel').on('init', function() {
  ... do something
}).on('click', function() {
  ... something else
}).on('beforeChange', function() {
  ... something else again
});

当你有“如果 x,添加类 Y,否则删除类 Y”时,你可以减少重复:

$('#header').toggleClass(
  'transparent-header',
  $('.slick-active .slide-container div').hasClass('intro-bg')
);

【讨论】:

  • 它不会被“缓存”,DOM 已经被渲染,所以它不会更新,直到有什么东西导致它再次被渲染。
  • 我不确定我是否理解您的评论 Drewness,但我已删除对“缓存”一词的引用以使我的意图更清楚
  • 读完this,它应该把事情弄清楚了。
  • 我明白了你的意思,我尝试了其他一些方法,我没有收到控制台错误,但它不起作用。
  • 是的,该页面与我上面描述的内容相同:如果您提前创建 jQuery 对象,那么它将包含在创建 jQuery 对象时与您的选择器匹配的元素,并且不包含后来添加的项目。
猜你喜欢
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多