Лучший способ получить оригинальную цель

Что такое 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;}                         
});

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


person Alan Storm    schedule 27.01.2009    source источник
comment
Наткнулся на этот старый вопрос, задаваясь вопросом, почему этот ответ набрал всего одну треть голосов, принятых ответ кажется мне очень-очень лучше.   -  person Jonathan    schedule 30.04.2014


Ответы (5)


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

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

person eimaj    schedule 27.01.2009
comment
Разве это не то, что jQuery должен абстрагировать? Я действительно удивлен этому. - person cletus; 28.01.2009
comment
Я помню, как когда-то пытался использовать e.target, но столкнулся с проблемами. Похоже, что с тех пор они были исправлены (или я был исправлен некоторое время назад). Кроме того, причудливые трюки с завершением читаются для меня как две строки;) - person Alan Storm; 28.01.2009

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

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

Если вы зайдете на веб-сайт jQuery в действии и загрузите исходный код, взгляните на

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

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

person Russ Cam    schedule 27.01.2009

Использование event.originalTarget может привести к ошибке «Отказано в доступе к свойству XYZ из контекста, отличного от Chrome», поэтому я бы рекомендовал использовать следующее:

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

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

person JussiR    schedule 27.01.2011
comment
+1: Это единственная версия, которая работала у меня в кроссбраузерном режиме. - person Volker Rose; 23.08.2012

В сочетании с Как обнаружить щелчок за пределами элемента? вот как вы можете перехватить вспомогательный виджет с аналогичной функцией скрытия при нажатии снаружи, чтобы предотвратить скрытие вашего собственного всплывающего окна вместе с ним; в этом случае мы перехватываем всплывающий виджет 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);
});
person Joey T    schedule 02.07.2012

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

person spbala    schedule 27.06.2011
comment
Это то же самое, что и var t = e.srcElement || e.originalTarget; (только длиннее!) - person Gone Coding; 03.10.2016