2011-01-24 10 views
11

क्या सभी डीओएम तत्वों का पता लगाने का एक आसान तरीका है जो "कवर" (यानी, इसकी सीमाओं के भीतर) एक्स/वाई समन्वय जोड़ी के साथ एक पिक्सेल है?पूर्ण निर्देशांक द्वारा डीओएम तत्व ढूंढना

+1

अच्छी तरह से आप इस प्रश्न से एक सभ्य उत्तर प्राप्त कर सकते हैं: http://stackoverflow.com/questions/48999/getting-div-id-based-on-x-y-position – Orbling

+0

क्या आपका मतलब है कि एक से अधिक तत्व हैं? (आप सभी ओवरलैप की गणना भी करना चाहते हैं?) – galambalazs

+0

देखें कि यह समाधान आपको http://jsfiddle.net/eyxt2tt1/2/ में मदद करता है, तो स्क्रिप्ट यह पता लगा सकती है कि आपके DOM तत्व समन्वयित सेट के भीतर हैं या नहीं। – GibboK

उत्तर

7

आप document.elementFromPoint पर एक नज़र डाल सकते हैं, हालांकि मुझे नहीं पता कि कौन से ब्राउज़र इसका समर्थन करते हैं।
फ़ायरफ़ॉक्स और क्रोम करते हैं। It is also in the MSDN, लेकिन मैं इस दस्तावेज़ से इतना परिचित नहीं हूं इसलिए मुझे नहीं पता कि आईई संस्करण में यह शामिल है।

अद्यतन:

सभी तत्वों को इस स्थिति में किसी भी तरह कर रहे हैं खोजने के लिए, आप इस धारणा है कि यह भी माता-पिता के सभी तत्वों को इस स्थिति में हैं बना सकता है। बेशक यह पूर्ण स्थान तत्वों के साथ काम नहीं करता है।

elementFromPoint केवल आपको सबसे आगे तत्व प्रदान करेगा। वास्तव में दूसरों को ढूंढने के लिए आपको को सबसे अधिक तत्व के none पर सेट करना होगा और फिर फ़ंक्शन को फिर से चलाया जाना होगा। लेकिन उपयोगकर्ता शायद यह ध्यान देगा। आपको कोशिश करनी होगी।

+0

@ फ़ेलिक्स क्लिंग यह जाने के लिए एक तरह की तरह लगता है, मैं ब्राउज़र संगतता की जांच करूंगा। –

+1

@etranger - एफएफ <3.0 के पास यह सुनिश्चित नहीं है। इसके अलावा यह बुरा नहीं है: http://www.quirksmode.org/dom/w3c_cssom.html#documentview – galambalazs

+0

@galambalazs: ओह यह सीएसएस तालिका में था ... मैंने केवल डोम टेबल पर एक नज़र डाली थी। –

3

मैं नहीं रोक पाया अपने आप फेलिक्स Kling के जवाब पर कूदने के लिए:

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)); 
}); 

अद्यतन: पृष्ठभूमि रंग!

+0

यह हर 'mousemove' पर करना बहुत अधिक * सीपीयू ओवरकिल * है। उल्लेख नहीं है कि ओपी ने कभी भी यह नहीं कहा कि वह इसका उपयोग करना चाहता है। – galambalazs

+0

@galambalazs: इसे बहुत गंभीर मत समझो।हालांकि, मेरा सीपीयू लोड 20% से अधिक नहीं है, लेकिन आंतरिक मूसमॉव हैंडलर के आस-पास 'clearTimeout'/'setTimeout' बैलेंसर डालने के लिए स्वतंत्र महसूस करें;) – jAndy

1

यह काम (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; 
}​ 

जब :visible का उपयोग कर, तो आप इस के बारे में पता होना चाहिए:

दृश्यता वाले तत्व: छिपा हुआ या अस्पष्टता: 0 दिखाई माना जाता है, चूंकि वे अभी भी लेआउट में जगह का उपभोग करते हैं। एनिमेशन के दौरान तत्व को छुपाएं, तत्व को एनीमेशन के तक दिखाई देने वाला माना जाता है। एनीमेशन दिखाने के लिए एनिमेशन के दौरान, तत्व एनीमेशन में शुरुआत में दिखाई देने वाला माना जाता है।

तो, आपकी आवश्यकता के आधार पर, आप visibility:hidden और opacity:0 तत्वों को बाहर करना चाहते हैं।

संबंधित मुद्दे