Лучший способ получить исходную цель

Какой способ jQuery как и/или лучший способ получить исходную цель события в jQuery (или в браузере javascript вообще).

Я использовал что-то вроде этого

$('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;}                         
});

который работает, но я не доволен тем, что вы обнимаете две линии. Есть ли лучший способ?

Ответ 1

Вы можете сделать это в одной строке с var originalElement = e.srcElement || e.originalTarget;, но это не очень похоже на JQuery; -)

[Изменить: Но согласно http://docs.jquery.com/Events/jQuery.Event#event.target event.target может сделать...]

Ответ 2

Я считаю, что e.target - это то, что вам нужно

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

Если вы перейдете на сайт jQuery in Action и загрузите исходный код, посмотрите

  • Глава 4 - dom.2.propagation.html

который посвящен распространению событий с обработчиками пузырьков и захватов

Ответ 3

Использование event.originalTarget может привести к тому, что "Permission denied" получит доступ к свойству "XYZ" из нехромового контекста "-error", поэтому я бы рекомендовал использовать следующее:

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

event.target работает в Firefox, Opera, Google Chrome и Safari.

Ответ 4

В сочетании с Как обнаружить клик за пределами элемента? вот как вы можете захватить субподрядку -widget с аналогичной функцией "скрывать-когда-щелкнул-наружу", чтобы не допустить, чтобы ваш собственный pop-over скрывался вместе с ним; в этом случае мы захватываем виджет всплывающих окон JQuery UI Datepicker:

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

Ответ 5

в нормальном Javascript, var t = (e.originalTarget)? e.originalTarget: e.srcElement; должно быть достаточно, чтобы прочитать его во всех браузерах.