2011-01-24 36 views
11

Có cách nào đơn giản để xác định tất cả các phần tử DOM "che" (nghĩa là, nằm trong ranh giới của nó) pixel với cặp tọa độ X/Y không?Định vị phần tử DOM theo tọa độ tuyệt đối

+1

Bạn có thể nhận được câu trả lời hợp lý từ câu hỏi này: http://stackoverflow.com/questions/48999/getting-div-id-based-on-x-y-position – Orbling

+0

Bạn có nghĩa là có nhiều hơn một phần tử? (bạn muốn tất cả các chồng chéo để được tính toán quá?) – galambalazs

+0

Hãy xem nếu giải pháp này giúp bạn ra http://jsfiddle.net/eyxt2tt1/2/ kịch bản có thể phát hiện nếu các yếu tố DOM của bạn nằm trong một tập hợp các phối hợp. – GibboK

Trả lời

7

Bạn có thể xem document.elementFromPoint mặc dù tôi không biết trình duyệt nào hỗ trợ nó.
Firefox và Chrome có. It is also in the MSDN, nhưng tôi không quen thuộc với tài liệu này vì vậy tôi không biết trong đó phiên bản IE được bao gồm.

Cập nhật:

Để tìm tất cả các yếu tố đó là bằng cách nào đó tại vị trí này, bạn có thể làm cho các giả định rằng tất cả các yếu tố cũng của cha mẹ đang ở vị trí này. Tất nhiên điều này không làm việc với các yếu tố vị trí tuyệt đối.

elementFromPoint sẽ chỉ cung cấp cho bạn yếu tố phía trước nhất. Để thực sự tìm thấy những người khác, bạn sẽ phải đặt display của phần tử phía trước nhất thành none và sau đó chạy lại chức năng. Nhưng người dùng có lẽ sẽ nhận thấy điều này. Bạn sẽ phải thử.

+0

@Felix Kling Điều này nghe có vẻ giống như một cách để đi, tôi sẽ kiểm tra tính tương thích của trình duyệt. –

+1

@etranger - FF <3.0 không chắc chắn. Khác hơn là nó không phải là xấu: http://www.quirksmode.org/dom/w3c_cssom.html#documentview – galambalazs

+0

@galambalazs: Oh nó đã được trong bảng CSS ... Tôi chỉ có một cái nhìn tại bảng DOM. –

3

tôi không thể ngăn bản thân mình để nhảy về câu trả lời Felix Kling của:

var $info = $('<div>', { 
    css: {  
     position: 'fixed', 
     top:   '0px', 
     left:  '0px', 
     opacity:  0.77, 
     width:  '200px', 
     height:  '200px', 
     backgroundColor: '#B4DA55', 
     border:  '2px solid black' 
    } 
}).prependTo(document.body); 

$(window).bind('mousemove', function(e) { 
    var ele = document.elementFromPoint(e.pageX, e.pageY); 
    ele && $info.html('NodeType: ' + ele.nodeType + '<br>nodeName: ' + ele.nodeName + '<br>Content: ' + ele.textContent.slice(0,20)); 
}); 

cập nhật: background-color!

+0

Làm điều đó trên mỗi 'mousemove' là khá nhiều một * CPU overkill *. Chưa kể OP chưa bao giờ nói về những gì anh ta muốn sử dụng nó. – galambalazs

+0

@galambalazs: đừng coi nó quá nghiêm trọng.Tuy nhiên, tải CPU của tôi không vượt quá 20%, nhưng hãy đặt cân bằng 'clearTimeout' /' setTimeout' xung quanh trình xử lý mousemove bên trong;) – jAndy

1

này không được công việc (fiddle):

$(document).click(function(e) { 
    var hitElements = getHitElements(e); 
}); 

var getHitElements = function(e) { 
    var x = e.pageX; 
    var y = e.pageY; 
    var hitElements = []; 

    $(':visible').each(function() { 
     var offset = $(this).offset(); 
     if (offset.left < x && (offset.left + $(this).outerWidth() > x) && (offset.top < y && (offset.top + $(this).outerHeight() > y))) { 
      hitElements.push($(this)); 
     } 
    }); 

    return hitElements; 
}​ 

Khi sử dụng :visible, bạn nên lưu ý điều này:

Elements với visibility: hidden hoặc opacity: 0 được coi là có thể nhìn thấy, vì họ vẫn tiêu thụ không gian trong bố cục. Trong hoạt ảnh ẩn phần tử, phần tử được coi là hiển thị cho đến khi kết thúc hoạt ảnh. Trong quá trình hoạt ảnh để hiển thị phần tử, phần tử là được coi là hiển thị khi bắt đầu hoạt ảnh.

Vì vậy, dựa trên nhu cầu của bạn, bạn sẽ muốn loại trừ các yếu tố visibility:hiddenopacity:0.

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