2009-01-27 23 views
24

Jaki jest jQuery i/lub najlepszy sposób na uzyskanie oryginalnego celu zdarzenia w jQuery (lub ogólnie w javascriptie przeglądarki).Najlepszy sposób na uzyskanie oryginalnego celu

Używam coś jak to

$('body').bind('click', function(e){ 
     //depending on the browser, either srcElement or 
     //originalTarget will be populated with the first 
     //element that intercepted the click before it bubbled up 
     var originalElement = e.srcElement; 
     if(!originalElement){originalElement=e.originalTarget;}       
}); 

który działa, ale nie jestem zadowolony z funkcja dwóch linii wąchania. Czy istnieje lepszy sposób?

+1

Natknęliśmy się na to stare pytanie zastanawiać dlaczego ** [ta odpowiedź] (http://stackoverflow.com/a/4816990/2407212) ** tylko jedną trzecią głosów, ponieważ zaakceptowana odpowiedź wydaje mi się o wiele lepsza. – Jonathan

Odpowiedz

34

Można to zrobić w jednej linii z var originalElement = e.srcElement || e.originalTarget; ale to nie całkiem jak jQuery ;-)

[Edit: Jednak według http://docs.jquery.com/Events/jQuery.Event#event.targetevent.target może zrobić ...]

+8

Czy tego typu rzeczy jQuery nie należy rozdzielać? Naprawdę jestem tym zaskoczony. – cletus

+0

Pamiętam, jak próbowałem e.target jakiś czas, zanim znowu pojawiły się problemy z tym. Wygląda na to, że zostały już naprawione (lub zostały naprawione od jakiegoś czasu). Również fantazyjne triki kończące są dla mnie jak dwie linie;) –

+0

Jesteś szalonym ratownikiem! Dziękuję Bogu za to jednoosobowe ... –

22

wierzę, e .target jest to, czego wymagają

$('body').bind('click', function(e){ 
       e.target // the original target 
       e.target.id // the id of the original target            
}); 

Jeśli pójdziesz do jQuery in Action website i pobrać kod źródłowy, przyjrzeć

  • Rozdział 4 - dom.2.propagation.html

która zajmuje się propagacji zdarzeń z bańki i przechwytywania koparki

19

Korzystanie event.originalTarget może spowodować „Odmowa uprawnień, aby uzyskać dostęp właściwość 'XYZ' od A kontekst non-chrom”-error, więc polecam przy użyciu następujących:

var target = event.target || event.srcElement || event.originalTarget; 

event.target prace nad Firefox, Opera, Google Chrome i Safari.

+1

+1: To jest jedyna wersja, która działała dla mnie w różnych przeglądarkach. –

0

w normalnym JavaScript, var t = (e.originalTarget)? E.originalTarget: e.srcElement; powinno wystarczyć, aby przeczytać ją we wszystkich przeglądarkach.

+0

Jest to to samo co 'var t = e.srcElement || e.originalTarget; '(tylko dłużej!) –

2

W połączeniu z How to detect a click outside an element? można tutaj zastrzec pułapkę pod-widgetu z podobną funkcją ukrywania i klikania, aby zapobiec ukrywaniu się własnego pop-upu; w tym przypadku są zatrzymując jQuery UI Datepicker pop-over widget:

// not using jquery .one handler for this, so we can persist outside click later 
$('html').click(function(evt) { 
    // just return if element has the datepicker as a parent 
    if ($(evt.target).parents('#ui-datepicker-div').length>0) return; 

    //toggle shut our widget pop-over 
    $('#mywidget').toggle(); 

    // now, unbind this event since our widget is closed: 
    $(this).unbind(evt); 
}); 
Powiązane problemy