2012-10-11 2 views
8

Mögliche Duplizieren:
How to get a list of all elements that resides at the clicked point?Javascript/jquery, erhalten alle divs Standort bei (x, y). Weiterleitung berührt?

Ich weiß, dass ich das Element mit dem höchsten Z-Index document.elementFromPoint(x,y) durch Verwendung erhalten kann.

Das Problem ist, ich muss jedes div, das den Standort des Touch-Ereignis enthält enthält.

Wie kann ich Berührungen an Elemente darunter verbreiten?

ich einige Hacky Lösungen gesehen haben, die das Ereignis oder Zeiger-Ereignisse Stil mit CSS zeigen/verstecken Elemente während neu zu erzeugen, jedoch kann ich nicht diese verwenden und sie verursachen Flackern kann ...

Die folgende Diagramm veranschaulicht, was ich tun muß:

Wenn die lila, grün und blau-Boxen, die div-Elemente repräsentieren, und der rote Punkt ist die Berührungsstelle, ich brauche eine Funktion, die „div3 zurückkehren würde, div2, div1 ".

+0

Ich habe ein [Plugin] (http://jsfiddle.net/SpYk3/2FZVW/) Ich habe ein während zurück, dass etwas Ähnliches mit dem Cursor tut. Ich bin mir ziemlich sicher, dass das gleiche Prinzip auf Touch-Variable angewendet werden kann, aber hier bei der Arbeit, kann ich nicht einmal meine Geige nutzen, geschweige denn meinen alten unverarbeiteten Code sehen, ich werde versuchen, mich an dieses Problem zu erinnern Ich komme heute nach Hause und werde mit dir zusammenkommen. Für den Moment habe ich einen Link zu meinem Plugin hinzugefügt und Sie können vielleicht finden, was Sie in dieser "Box" sozusagen brauchen. g'luck! – SpYk3HH

+0

Es hat eine Funktion darin, die alle Elemente unter dem Cursor zurückgibt, es ist schon eine Weile her, seit ich es benutzt habe, also kann ich dir nicht genau sagen, welche Seite ich oben gefunden habe SO Antwort] (http://stackoverflow.com/questions/1843674/how-to-change-cursor-from-pointer-to-finger-using-jquery/10353324#10353324)) – SpYk3HH

+1

Sie sollten sich nicht für einen Moment sorgen Verbergen der Elemente, da der Browser erst nach dem Ende der Funktion neu gezeichnet wird. – Shmiddty

Antwort

19

Kein Flackern mit diesem Code:

$("body").click(function(e){ 
    var x = e.pageX, y = e.pageY; 
    var res = []; 

    var ele = document.elementFromPoint(x,y); 
    while(ele && ele.tagName != "BODY" && ele.tagName != "HTML"){ 
     res.push(ele); 
     ele.style.display = "none"; 
     ele = document.elementFromPoint(x,y); 
    } 

    for(var i = 0; i < res.length; i++){ 
     res[i].style.display = ""; 
    } 
    console.log(res); 
});​ 
+0

Ich war mir nicht bewusst, dass der Browser nicht neu zeichnen würde .. danke für die Hilfe :) –

+0

Diese Methode funktioniert nicht bei Elementen, die nicht schon display = block haben. Dies unterbricht das Layout. – qodeninja

+0

Ja, aber ich kann die Stile entsprechend zurücksetzen, wenn ich andere Anzeigetypen habe. Zum Glück müssen die Elemente die ich brauche für den Einsatz blockieren. –

2

Was ist zu tun:

$(document).click(function(e) { 
    var pageX = e.pageX; 
    var pageY = e.pageY; 
    $('*').each(function(index) { 
     var offset = $(this).offset(); 
     var left = offset.left; 
     var right = offset.right; 
     var width = $(this).width(); 
     var height = $(this).height(); 
     if(pageX > left && pageX < left + width) { 
      if(pageY > top && pageY < top + height) { 
        //Handle the div 
      } 
     } 
    }); 
});