2010-10-23 24 views
12

Cho hai điểm trên một trang web và một tập hợp các phần tử DOM, cách tìm ra tập con của các phần tử DOM nằm trong khu vực hình chữ nhật được xác định bởi hai điểm?Lấy các phần tử DOM bên trong vùng hình chữ nhật của một trang

Tôi đang làm việc trên thư viện dựa trên web, trong đó mọi ảnh được gói trong thẻ li. Khi người dùng kéo ra một vùng hình chữ nhật bằng chuột, tất cả các phần tử li bên trong hình chữ nhật được đánh dấu là đã chọn.

Ưu tiên giải pháp jQuery cho ít lời nói và hiệu quả hơn.

Trả lời

7

Hãy thử một cái gì đó như thế này:

// x1, y1 would be mouse coordinates onmousedown 
// x2, y2 would be mouse coordinates onmouseup 
// all coordinates are considered relative to the document 
function rectangleSelect(selector, x1, y1, x2, y2) { 
    var elements = []; 
    jQuery(selector).each(function() { 
     var $this = jQuery(this); 
     var offset = $this.offset(); 
     var x = offset.left; 
     var y = offset.top; 
     var w = $this.width(); 
     var h = $this.height(); 

     if (x >= x1 
      && y >= y1 
      && x + w <= x2 
      && y + h <= y2) { 
      // this element fits inside the selection rectangle 
      elements.push($this.get(0)); 
     } 
    }); 
    return elements; 
} 

// Simple test 
// Mark all li elements red if they are children of ul#list 
// and if they fall inside the rectangle with coordinates: 
// x1=0, y1=0, x2=200, y2=200 
var elements = rectangleSelect("ul#list li", 0, 0, 200, 200); 
var itm = elements.length; 
while(itm--) { 
    elements[itm].style.color = 'red'; 
    console.log(elements[itm]); 
} 
+1

Cảm ơn ArtBIT. Tôi vừa tìm kiếm một lúc trên Google. Dường như không có cách nào thuận tiện để làm điều này, không có giải pháp nào tốt hơn là lặp lại tất cả các phần tử DOM và thực hiện toán học tiểu học trên chúng. – powerboy

+0

Đừng lo lắng @powerboy, và vâng, đó là lý do tại sao tôi đã thêm hỗ trợ 'selector', để giảm số lượng phần tử bạn cần xử lý. – ArtBIT

+0

Bạn có thể sử dụng [getBoundingClientRect()] (https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect) để lấy một đối tượng với 'top',' right', 'bottom' , 'left',' width' và 'height', trong một cuộc gọi. –

Các vấn đề liên quan