【问题标题】:Which way is efficient?哪种方式有效?
【发布时间】:2012-11-13 20:02:12
【问题描述】:

我在页面上有超过 500 个按钮。

<button class="btn-x">test</button>

jQuery:

// #1
$('button[class*="btn-x"]').live('click', function() { }});

// #2
$('.btn-x').live('click', function() { }});

现在哪个调用效率高,直接通过class或者button[attr*]调用,我想知道,因为当我有超过500个按钮时它可能会导致问题,但我不确定它们是否会影响相同的结果.

【问题讨论】:

  • 数字 1 应该是 $('button.btn-x')... - 你不需要使用属性包含选择器来选择一个类。
  • 你应该使用on,因为live已被弃用。
  • 第二个应该更快。检查this stackoverflow question
  • 为什么会有 500 个按钮?谁会点击它们?
  • @Bennor 好吧,这不是问题 :)

标签: javascript jquery html jquery-selectors


【解决方案1】:

类选择器将快一个数量级。

话虽如此,live() 已被弃用。您应该使用 delegate() 或者如果您使用的是 jQuery 1.7+ on()`。

例如:

// < jQ 1.7
$('#staticParent').delegate('.btn-x', 'click', function() { });

// jQ 1.7+
$('#staticParent').on('click', '.btn-x', function() { });

【讨论】:

    【解决方案2】:

    如果你有一个类属性,那么使用类选择器而不是属性选择器才有意义。效率作为次要奖励提供; jQuery 和浏览器原生实现都对类选择器进行了特殊优化,因为它们具有相关的语义和用法。

    此外,这不是使用属性选择器处理类属性的完全正确的方法。您可能是指[class~="btn-x"] 而不是[class*="btn-x"]。这些中的每一个都以不同的方式匹配属性值,前者的行为更接近于类属性的选择器。

    【讨论】:

    • 哈哈,真的,直到现在我才读过第一个选择器
    【解决方案3】:

    最有效的是拥有一个事件处理程序而不是 500 个。

    正如@Rory McCrossan 所说,最好将事件处理程序附加到静态父级:

    // one event handler, recommended
    $('#staticParent').on('click', '.btn-x', function() { }); 
    
    // 500 event handlers, not recommended
    $("button.btn-x").on("click", function() { ... });
    

    【讨论】:

      【解决方案4】:

      类选择器更快。类选择器只比 id 选择器慢。对于 jQuery 1.7 及更高版本,您应该使用 .delegate().on() 而不是 .live()。在您的情况下,这很重要,因为.delegate().live() 附加一个处理程序而不是 500。

      【讨论】:

      • live() 和delegate() 一样,只注册一个事件处理程序。它们之间的不同之处在于 live 使用根文档元素,而委托让您选择它的锚定位置。
      【解决方案5】:

      如果您正在寻找最有效的代码,您可能会这样做:

      document.getElementsByClassName("btn-x");
      

      但我认为这在 IE 中不起作用。如果您也在寻找适合 IE 的解决方案,您可以这样做:

      function getElementsByClassName(className) {
          var a = [];
          if (document.getElementsByClassName) {
              a = document.getElementsByClassName(className);
          } else {
              var node = document.body;
              var re = new RegExp('(^| )'+classname+'( |$)');
              var els = node.getElementsByTagName("*");
              for(var i=0,j=els.length; i<j; i++) {
                  if(re.test(els[i].className)) { a.push(els[i]); }
              }
          }
          return a;
      }
      

      (最后取自javascript document.getElementsByClassName compatibility with IE

      我没有测试它,但这应该比使用 jQuery 更有效。

      【讨论】:

      • 在 jQuery (1.7+) 的最新版本中,$('.classname') 使用 getElementsByClassName,所以这几乎是一样的。
      • 没有。使用该类一次性搜索所有元素。即使有 500 个元素。
      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 2012-10-01
      • 2012-09-09
      • 2015-11-03
      • 2011-06-21
      相关资源
      最近更新 更多