2009-10-13 12 views
7

przykład:skutecznie wykryć, kiedy elementy rodzeństwa Nakładanie

<div id="big">&nbsp;</div> 
<div class="small">&nbsp;</div> 
<div class="small">&nbsp;</div> 
<div class="small">&nbsp;</div> 
<div class="small">&nbsp;</div> 
<div class="small">&nbsp;</div> 
<!-- ...and so on --> 

„#big” znajduje się całkowicie z tyłu części „.small” S, ale jest element nadrzędny.

robiłem to:

  var smallArray = []; 

      var $big = $('#big'); 
      var $bigPos = $big.offset(); 

      $('div.small').each(function() { 
        var $this = $(this); 
        var $thisPos = $this.offset(); 

        if(
          $thisPos.left >= $bigPos.left && 
          $thisPos.left <= $bigPos.left+$big.outerWidth() && 
          $thisPos.top >= $bigPos.top && 
          $thisPos.top <= $bigPos.top+$big.outerHeight() 
        ) smallArray.push($this); 
      }); 

... ale to wydaje kludgy. Czy brakuje mi niektórych metod jQuery lub wanilii JavaScript, które pozwolą mi zrobić to w bardziej elegancki sposób, efektywniej?

Dzięki za wszelką pomoc, jaką możesz zapewnić.

+0

co próbujesz osiągnąć? –

+0

Twoja formuła wykryje tylko, czy lewy górny punkt małego elementu znajduje się wewnątrz dużego elementu. Co się stanie, jeśli dolny prawy punkt małego znajduje się wewnątrz dużego? Nakładają się, ale Twoja formuła tego nie wykryje. – cmcculloh

Odpowiedz

21

Wzór ten wykrywa, czy każdy z wymienionych elementów pokrywa się element docelowy:

function findIntersectors(targetSelector, intersectorsSelector) { 
    var intersectors = []; 

    var $target = $(targetSelector); 
    var tAxis = $target.offset(); 
    var t_x = [tAxis.left, tAxis.left + $target.outerWidth()]; 
    var t_y = [tAxis.top, tAxis.top + $target.outerHeight()]; 

    $(intersectorsSelector).each(function() { 
      var $this = $(this); 
      var thisPos = $this.offset(); 
      var i_x = [thisPos.left, thisPos.left + $this.outerWidth()] 
      var i_y = [thisPos.top, thisPos.top + $this.outerHeight()]; 

      if (t_x[0] < i_x[1] && t_x[1] > i_x[0] && 
       t_y[0] < i_y[1] && t_y[1] > i_y[0]) { 
       intersectors.push($this); 
      } 

    }); 
    return intersectors; 
} 

Here is a POC.

This SO question bardzo przydatne w rozwiązaniu tego problemu.

+0

Potrzebowałem również wykrycia zachodzących na siebie elementów w jQuery i używałem wtyczki "jquery-overlaps", ale czasami powoduje to zawieszenie IE. Ta funkcja była świetnym zamiennikiem. Dzięki! – shipshape

+0

Hey @shipshape Jeśli jQuery Overlaps powoduje awarię IE, dlaczego nie zgłosiłeś tego na github? Pomogłoby wielu innym użytkownikom ... – bart

+0

@cmcculloh dzięki za podzielenie się tym! –

Powiązane problemy