哪个表现更好,检查课程或添加课程

NLA*_*nda 2 javascript performance jquery

如果你有一个在滚动事件上触发的函数,那就更好了.

  1. 检查是否已添加类,如果没有添加
  2. 不要做任何检查,只需在每次需要时添加该类.
$(document).on('scroll', function () {
   var scrollTop = $(this).scrollTop();
   if (scrollTop > 50) {
      if (!$("nav .branding").hasClass("collapse"))
         $("nav .branding").addClass("collapse");
   } else {
      if ($("nav .branding").hasClass("collapse"))
         $("nav .branding").removeClass("collapse");
   }
});
Run Code Online (Sandbox Code Playgroud)

要么

$(document).on('scroll', function () {
   var scrollTop = $(this).scrollTop();
   if (scrollTop > 50) {
      $("nav .branding").addClass("collapse");
   } else {
      $("nav .branding").removeClass("collapse");
   }
});
Run Code Online (Sandbox Code Playgroud)

第一次有一个额外的检查,但在另一个行动中可能(?)是一个更激烈的操作(?)

Pat*_*ssa 8

如果您担心性能,您可以/应该做的事情有以下几点:

1.缓存选择器:

Dom交互很昂贵,在你的情况下你$("nav .branding")多次打电话.

将它存储在一个变量中var $branding = $("nav .branding").

2.使用vanilla javascript来处理该类

取决于浏览器支持.

var branding = document.querySelector('nav .branding');

if (scrollTop > 50) {
  if (!branding.classList.contains("collapse")) {
    branding.classList.add("collapse");
  }
} else {
  if (branding.classList.contains("collapse")) {
    branding.classList.remove("collapse");
  }
}
Run Code Online (Sandbox Code Playgroud)

请记住,并非所有浏览器都支持该classList属性,在MDN上您可以找到有关兼容性的信息以及polyfill.

关于你原来的问题:jQuery的addClass有一个内置的检查类是否已经存在,所以你更好,当你不使用去hasClass事前,因为它会导致冗余,但千万记住,addClass〜70%少高性能classList.

  • 至于我担心这个问题用javascript标记,有很多方法可以解决问题,这是其中之一,[有一些统计](http://jsperf.com/hasclass-vs-classlist-dot-包含).这太乱了. (4认同)
  • @Alex他的回答是基于表现的. (2认同)
  • 到目前为止,这是最好的答案,因为它解决了唯一的实际性能问题(在滚动事件中反复运行),而vanilla版本当然比任何非本机API更受欢迎.@Alex有一个观点:你不应该检查类的存在,`classList` API足够聪明:) (2认同)
  • @Alex随时为答案做出贡献:) (2认同)
  • @Alex如果您发现答案缺乏添加或更完整的答案. (2认同)