JQuery position.top()速度慢,有很多元素

JQuery position.top()速度慢,有很多元素,jquery,Jquery,我需要找出列表中哪个元素位于页面顶部。我的解决方案是使用jQuery遍历元素并查看位置 这项功能很好,但当有很多元素时,性能会下降。请参阅此小提琴以获取简化示例 以下是我注意到的一些奇怪的事情 这是对position.top()的第一次调用,需要花费时间 我在chrome(近3秒)和firefox(不到1秒)中看到了截然不同的行为 对于我正在尝试做的事情,有更好的解决方案吗 这是密码 <p>Log: <div id="log"> </div> </

我需要找出列表中哪个元素位于页面顶部。我的解决方案是使用jQuery遍历元素并查看位置

这项功能很好,但当有很多元素时,性能会下降。请参阅此小提琴以获取简化示例

以下是我注意到的一些奇怪的事情

  • 这是对position.top()的第一次调用,需要花费时间
  • 我在chrome(近3秒)和firefox(不到1秒)中看到了截然不同的行为
对于我正在尝试做的事情,有更好的解决方案吗

这是密码

<p>Log:
<div id="log">
</div>
</p>

Items:
<ul id="items">
</ul>


for (var i = 0; i < 10000; i++) {
    $("#items").append("<li id='item_" + i + "'>" + i + "</li>");
}

var top = new Date().getTime();

$("li[id^='item_']").each(function() {

  var start = new Date().getTime();
  var top = $(this).position().top;
  var end = new Date().getTime();

  var time = end - start;


  if (time > 1) {
     $("#log").append($(this).attr('id') + ": " + time + "<br/>");
  }

});

var bottom = new Date().getTime();

var overalltime = bottom - top;

$("#log").append("Overall Time: " + overalltime + "<br/>");
日志:

项目:
对于(变量i=0;i<10000;i++){ $(“#项”)。追加(“
  • 1){ $(“#log”).append($(this.attr('id')+”:“+time+”
    ); } }); var bottom=new Date().getTime(); var总时间=底部-顶部; $(“#log”).append(“总时间:+overalltime+”
    );
  • 好问题,一些想法:

    • 您可能不知道jQuery在做这样的密集工作时会慢多少,它会做大量额外的工作,使所有内容都更易于使用。尝试使用本机JavaScript函数,您肯定会注意到性能差异

      // get all <li> elements
      var lis = document.getElementsByTagName('li');
      
      // get all class="item" elements
      var items = document.getElementsByClassName('item');
      
      // offsetTop is the top position of the element
      items[0].offsetTop;
      

      • 好问题,一些想法:

        • 您可能不知道jQuery在做这样的密集工作时会慢多少,它会做大量额外的工作,使所有内容都更易于使用。尝试使用本机JavaScript函数,您肯定会注意到性能差异

          // get all <li> elements
          var lis = document.getElementsByTagName('li');
          
          // get all class="item" elements
          var items = document.getElementsByClassName('item');
          
          // offsetTop is the top position of the element
          items[0].offsetTop;
          

        你能告诉我们更多关于这个问题的信息吗?元素会移动吗?它们如何移动?在实际的应用程序中,当用户滚动页面时,我希望在每10个元素到达页面顶部后发生一些事情。正如我所提到的代码,它检测页面顶部的项目。但是,如果页面有数千个元素,那么检测功能就会变得太慢,页面没有响应。为什么不使用滚动功能呢?元素高度是否相同?此功能将在滚动功能上调用。我不能保证元素的高度,页面上还有其他元素,所以这不够准确。基本上,如果我能找出为什么position.top()在第一次调用时速度如此之慢,那么我的解决方案将是非常好的。你能告诉我们更多关于这个问题的信息吗?元素会移动吗?它们如何移动?在实际的应用程序中,当用户滚动页面时,我希望在每10个元素到达页面顶部后发生一些事情。正如我所提到的代码,它检测页面顶部的项目。但是,如果页面有数千个元素,那么检测功能就会变得太慢,页面没有响应。为什么不使用滚动功能呢?元素高度是否相同?此功能将在滚动功能上调用。我不能保证元素的高度,页面上还有其他元素,所以这不够准确。基本上,如果我能找出为什么position.top()在第一次调用时速度如此之慢,那么我的解决方案将非常好。谢谢你的建议。我已经用javascript尝试过了,并循环了结果。从3秒降到2秒多一点似乎更快。也许这几乎不可能在瞬间实现。我推迟了工作,一次加载一定数量的元素,但随着页面的增长,问题就开始了。让我困惑的是,为什么对position.top()的第一次调用要花上两秒钟,其余的我怀疑都与此有关是的,页面正在预热。谢谢你的建议。我已经用javascript尝试过了,并循环了结果。从3秒降到2秒多一点似乎更快。也许这几乎不可能在瞬间实现。我推迟了工作,一次加载一定数量的元素,但随着页面的增长,问题就开始了。让我困惑的是,为什么对position.top()的第一次调用要花上两秒钟,而我怀疑其余的调用都与此有关——是的,页面正在预热。