【问题标题】:jQuery: select elements with slicejQuery:使用切片选择元素
【发布时间】:2017-01-11 18:03:58
【问题描述】:

在一个页面中,我有相同类的不同 div 元素

<div id="masterdiv">
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
  <div class="a"></div>
<div>

使用 setTimeout,我想将三个元素用于 time 对它们执行一些操作。

我尝试了切片功能:

var elements = $("#masterdiv").find('.a');

var t = setInterval(function () {
   var currentElements = elements.slice(points.f, points.l); 
  /* where points.f = 0 and points.l = 3 */
  /* do something with currentElements then increment points.f and points.l +1 */

}, xinterval );

但是有一个问题,在某个时间,我的代码会在 11 个 div 中选择一个 .slice(8,10) / .slice(9,11) 和一个。

所以在这些情况下 (point.l &gt; elements.length()) 我想选择第一个 div 而不是超出的:

  • 在 .slice(8,10) 的情况下,我想选择而不是 不存在 div '10' div 0 和 8,9 div。
  • 在 .slice(9,11) 的情况下,我想选择而不是 不存在 div '10','11' div 0,1 和 9 div。

我怎样才能做到这一点?我可以用 slice 来做还是应该使用其他功能?

提前感谢所有帮助。

【问题讨论】:

  • 你可以随时检查 points.ls 是否 >= elements.length
  • 开始时你的 points.l 真的是 3 吗?如果,那么,你不会有 .slice(8,10) 的情况。 l 是2,而不是?无论如何,你的观点很明确。
  • 是的,@sinisake 我输入了错误的切片范围,没有积分。l 从 3 开始,所以如果有 .slice(8,11) 和 .slice(9,12) 之类的情况。
  • 为什么不使用

标签: javascript jquery


【解决方案1】:

另一种方法是使用 pop() 和 push() 数组函数,如下所示:

var $elements = $("#masterdiv").find('.a');
// Convert to native Array
var elements = Array.prototype.slice.apply($elements);

var t = setInterval(function () {

  elements.slice(points.f,points.l).forEach(function(el){ 

      // do something on the element... 
      $(el).addClass('debug');

   });
  elements.push(elements.shift()); // Re-arrange elements array for loop

}, xinterval );

这里是 codepen 演示:http://codepen.io/kostasx/pen/mRVzqQ?editors=0010

【讨论】:

    【解决方案2】:

    你可以像这样增加你的变量,

    var elements = $("#masterdiv").find('.a');
    
      /* where points.f = 0 and points.l = 3 */
    var t = setInterval(function () {
     var currentElements;
      
      if(points.l > elements.length && points.f<=elements.length){
        tempArr1 = elements.slice(points.f);
        tempVar = points.l % elements.length;
        tempArr2 = elements.slice(0,tempVar);
        currentElements = [...tempArr1,...tempArr2];
        
      }
      else{
       currentElements = elements.slice(points.f, points.l); 
      }
      
      /* do something with currentElements then increment points.f and points.l +1 */  
    
    }, xinterval );

    我还没有讨论过边缘情况,请自行寻找;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2011-10-07
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多